
ディレクトリ A、B、C がパス 1 に保存されており、ディレクトリ A_1、A_2、A_3、B_1、B_2、B_3、C_1、C_2、C_3 がパス 2 に保存されています。
パス1のディレクトリA、B、Cに「file.txt」の同じコピーが保存されています
path2 のすべてのディレクトリに「file.txt」のコピーを作成したいです。次のように for ループを試しました:
#!/bin/bash
path1=path to directories A, B, C
path2=path to directories A_1, A_2, A_3, B_1, B_2, B_3, C_1, C_2, C_3
for i in $(cat dirname.txt); do #dirname.txt is a file located in path1 contain the directories names in path1 (i.e A, B, C)
cp $path1/${i}/file.txt $path2/${i}_*/
done
以前のコードでは、path2 内のディレクトリを読み取ることができませんでした。
何が間違っているのでしょうか?
答え1
cpは複数のソースを取ることができますが、複数の宛先を取ることはできません。 を展開して宛先ディレクトリを取得する場合は
"path2/${i}_"*/
、2 番目のループが必要ですfor
。
for i in A B C; do
for j in "path2/${i}_"*/; do
cp "$path1/$i/file.txt" "$j"
done
done
あるいは、ターゲット ディレクトリ名を自分で生成することもできます。
for i in A B C; do
for j in "path2/${i}_"{1..3}/; do
cp "$path1/$i/file.txt" "$j"
done
done
引用符で囲まない特別な理由がない限り、シェル変数の展開はデフォルトで二重引用符で囲む必要があることを忘れないでください。