一種のフォルダ(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]このコマンドはrename
Debian / Ubuntuとその派生、prename
Redhat / 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