ファイルリストをターゲットインデックスと一致させて移動します。

ファイルリストをターゲットインデックスと一致させて移動します。

ファイル名のリスト(一部はスペースを含む)を含み、そのファイルが属するフルファイルパスのリスト(スペースを含む)をランダムな順序で含む2つのテキストファイルとがあるとしますsrc.txt。たとえば、dest.txtsrc.txt/src/dir/dest.txt

src.txt:

file 1.jpg
file_2.html
file 3.jpg

ターゲット.txt:

/dest/dir 1/file 3.jpg
/dest/file4.txt
/dest/file 5.txt
/dest/dir 2/file 1.jpg
/dest/file_2.html

シェルで一括移動操作を実行するには?ソースファイルを繰り返しながらwhile readそのコマンドを使用する必要があると確信していますが、ここではこれが必須か必須mvかわかりません。空白文字の解析エラーが発生し続けます。grepsedcannot stat...

ベストアンサー1

そしてzsh

src=(${(f)"$(<src.txt)"})
for f (${(f)"$(<dest.txt)"})
(($src[(Ie)$f:t])) && mv /src/dir/$f:t $f

これは配列内の各ファイルを読み取り、次に配列内の各要素を読み取ります。「目的地」basename(すべての先行パス名コンポーネントを削除する修飾子)が次の:t場合zsh「源泉」配置し、ファイルを移動します。練習を実行するには、mvに置き換えますprintf '"%s" -> "%s"\n'


これで、以下を実行することもできます(まだzsh)。

for f (${(f)"$(grep -Ff src.txt dest.txt)"})
mv /src/dir/$f:t $f

src.txtinのファイル名がパスリストのディレクトリ名(またはその名前の一部)と一致しないinのファイル名やinなどのパスはdest.txtdata1src.txt/path/data1_dir/some_filedest.txtgrep/filename$Fdest.txtsrc.txtbash4

readarray -t files < <(sed 's|[[\.*^$/]|\\&|g;s|.*|/&$|' src.txt | grep -f- dest.txt)
for f in "${files[@]}"; do mv /src/dir/"${f##*/}" "$f"; done

おすすめ記事