ファイル名のリスト(一部はスペースを含む)を含み、そのファイルが属するフルファイルパスのリスト(スペースを含む)をランダムな順序で含む2つのテキストファイルとがあるとしますsrc.txt
。たとえば、dest.txt
src.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
かわかりません。空白文字の解析エラーが発生し続けます。grep
sed
cannot 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.txt
inのファイル名がパスリストのディレクトリ名(またはその名前の一部)と一致しないinのファイル名やinなどのパスはdest.txt
、data1
src.txt
/path/data1_dir/some_file
dest.txt
grep
/filename$
F
dest.txt
src.txt
bash
4
readarray -t files < <(sed 's|[[\.*^$/]|\\&|g;s|.*|/&$|' src.txt | grep -f- dest.txt)
for f in "${files[@]}"; do mv /src/dir/"${f##*/}" "$f"; done