フォルダ名でファイル名を変更する

フォルダ名でファイル名を変更する

一種のフォルダ(A、B、C、D、E、F、G、H)があり、各フォルダにはすべてのフォルダに同じ名前のファイル(file.txt)がありますが、ファイルのサイズは次のとおりです。フォルダからフォルダへ。このファイルを各フォルダから新しいフォルダ(X)にコピーし、ファイル名を元のフォルダと同じにしたいと思います。このbachスクリプトを使用してファイルをコピーします。

#!/bin/bash      
insub_FIM_M_1=path to a parent folder conatin all the folders (A,B,C,D,E,F,G,H) 

for i in $(cat $insub_FIM_M_1/FIM_1.txt); do
cp  insub_FIM_M_1/${i} <path to the new folder X >
done

このコードでは、すべてのファイルは同じフォルダ内の名前を持つため、新しいフォルダ(X)からすべてのファイルが上書きされます。ファイルのソースを知るためにファイル名にフォルダ名を追加するには、このコードをどのように変更する必要がありますか?

答え1

ディレクトリが親ディレクトリである特別な場合は、親ディレクトリでrename / prename [1]を使用してファイルをその親ディレクトリに移動できます。

rename -n 's:/:-:g' */file.txt

(テスト実行の場合は削除するか、実際の実行に-n置き換えます)-v

ファイルの深さが複数レベルの場合.txt(または深さが不明な場合)、globstarオプションを使用できます。

shopt -s globstar  # makes '**' match any levels of directories
rename -n 's:/:-:g' **/*.txt

[1]このコマンドはrenameDebian / Ubuntuとその派生、prenameRedhat / Fedoraとその派生に適用されます。

答え2

サブディレクトリがあり、$insub_FIM_M_1コピーするファイルがfile.txt各サブディレクトリから呼び出されると仮定すると、

mkdir -p result || exit 1
for pathname in "$insub_FIM_M_1"/*/file.txt; do
    cp "$pathname" "result/$( basename "$( dirname "$pathname" )" )_file.txt"
done

ファイルはresult現在のディレクトリ内のディレクトリにコピーされ、ファイルが配置されているディレクトリに応じて各ファイルの名前が変更されます。

答え3

cat FIM_1.txtあなたが私たちにそれについて話していなかったので、あなたがこのファイルを使用している理由は完全にわかりません。このコードは、フォルダセットの各フォルダからコピーされ、元のフォルダの名前が付けられたfile.txtディレクトリに配置されます。X

cd "$insub_FIM_M_1"
for DIR in *
do
    test -d "$DIR" -a -f "$DIR/file.txt" || continue
    mv -f "$DIR/file.txt" "/path/to/X/$DIR"
done

答え4

次のコードを試しましたが、うまくいきます。

 #!/bin/bash   
insub_FIM_M_1=path to a parent folder conatin all the folders (A,B,C,D,E,F,G,H) 
out=path 
for i in $(cat $insub_FIM_M_1/FIM_1.txt); do
cp  insub_FIM_M_1/file.txt ${path}/${i}.txt
done

関連情報