編集する:私が達成しようとしている目標のより深い理解を助けるために、次の例を見てみましょう。チームの一部はフォルダ構造が悪く、それを修正することが私たちの目標です。
源泉:
/ShopA/Finances/Costs/contents
/ShopB/Finances/Costs/contents
/ShopC/Finances/Costs/contents
目的地:
/Finances/Costs/ShopA/contents
/Finances/Costs/ShopB/contents
/Finances/Costs/ShopC/contents
source.txt
正確にどのファイルをどのディレクトリにコピーするかについてのリスト(ファイルと配列)がありますが、destination.txt
手動で実行せずにソースファイルをそのターゲットにコピーする方法を見つけることが問題です。これは、コピーするファイルが何百ものあるためです。
ソースとターゲットのリストは1行ずつ一致します。たとえば、source.txt
ファイルの行1はファイルの行1と一致しますdestination.txt
。
私は成功せずに次のことを試しました。
rsync -arv --files-from=/home/user/Desktop/source.txt / --files-from=/home/user/Desktop/destination.txt /
^目的地は1つしかありません。動作しません。
for ((i = 0; i < ${#destination[@]}; i++)); do
rsync -arv --files-from=/home/im-admin/Desktop/source.txt / "${destination[@]}"
done
^私は間違っていることを知っていますが、各ソースフォルダとターゲットフォルダは一意であるため、ソースファイルの最初の行からターゲットファイル(または配列)の最初の行に直接ファイルをコピーする方法を理解するのに役立ちます。
答え1
Bash内の対応する要素間に1対1の対応を持つソートされた配列ペアがすでにある場合は、ループを使用して各配列ペアに対してコマンドを実行するのは非常に簡単です。
for i in "${!sources[@]}"; do
echo rsync -av -- "${sources[i]}" "${destinations[i]}"
done
(echo
表示された結果に満足したら、削除してファイルを実際にコピーしてください。)
配列変数にプレフィックスを適用すると、その!
変数はインデックスリストに展開されます。
によって暗示されるので、-r
オプションを省略しました。rsync
-a
テキストファイルに保存されているパスのリストは、1行に1つずつ(もちろんファイルパスに改行文字を含めることはできません)、次のように配列で読み取ることができます。
mapfile -t surces <source.txt
mapfile -t destinations <destination.txt
mapfile
(またはそれに対応するreadarray
)は、標準入力を改行文字(またはこのオプションを使用して明示的に指定された区切り文字-d
)に分割します。この-t
オプションは、区切り文字自体を削除するように指示します。それ以外の場合は、各配列要素の最後の文字として保持されます。