それは$(cat file_list.txt)
のようなPOSIXシェルにbash
リストコンテキストで(分割+グロブ演算子でzsh
のみ行い、スプリットあなたが期待通りの部分が)。
$IFS
(デフォルトでは、SPC、TAB、NL)の文字で分割され、グロビングを完全にオフにしない限り、グロブを実行します。
ここでは、改行のみで分割し、グロブ部分は不要なので、次のようにする必要があります。
IFS='
' # split on newline only
set -o noglob # disable globbing
for file in $(cat file_list.txt); do # split+glob
mv -- "$file" "new_place/$file"
done
これには、while read
空の行を破棄し、末尾の終了していない行を保持し、mv
のstdin を保持する(プロンプトの場合などに必要)利点があります(ループより)。
ただし、ファイルの完全なコンテンツをメモリに保存する必要があるという欠点があります(bash
およびなどのシェルでは数回zsh
)。
一部のシェル(とksh
、zsh
そしてより少ない程度にbash
)、あなたがそれを最適化することができます$(<file_list.txt)
代わりに$(cat file_list.txt)
。
while read
ループで同等のことを行うには、次のものが必要です。
while IFS= read <&3 -r file || [ -n "$file" ]; do
{
[ -n "$file" ] || mv -- "$file" "new_place/$file"
} 3<&-
done 3< file_list.txt
またはbash
:
readarray -t files < file_list.txt &&
for file in "${files[@]}"
[ -n "$file" ] || mv -- "$file" "new_place/$file"
done
またはzsh
:
for file in ${(f)"$(<file_list.txt)"}
mv -- "$file" "new_place/$file"
done
またはGNU mv
とzsh
:
mv -t -- new_place ${(f)"$(<file_list.txt)"}
または、GNU mv
とGNU xargs
およびksh / zsh / bashを使用:
xargs -rd '\n' -a <(grep . file_list.txt) mv -t -- new_place
bash / POSIXシェルで変数を引用するのを忘れることによるセキュリティへの影響で展開を引用しないでおくことの意味についての詳細