ファイルリストを削除して確認を要求したいです。リストはlist.txt
ファイルにあります。次のコマンドが正しく機能しないのはなぜですか?
while read i; do rm -i $i; done < list.txt
前のコマンドは私を待ちませんが、幸いにもファイルは削除されません。
バッシュを使っています。
ベストアンサー1
rm -i
while
ループから継承された標準入力から回答を読みます。したがって、list.txt
「本当に削除してもよろしいですか?」への答えとして、次の1行のテキストが使用されます。質問。この問題を解決するには、2つの入力ソースを分離する必要があります。最も簡単な方法は、read
別のファイル記述子から入力を取得することです。
while IFS= read <&3 -r i; do
rm -i -- "$i" # Quote the file name, not just to be safe,
# but because it's the right syntax.
done 3< list.txt
whileループへの標準入力(fd 0)はリダイレクトされなくなり、rm
必要に応じて端末から読み取られます。
または、次のことができます。
IFS=$'\n' # set field separator to newline
set -f # disable globbing upon command substitution
rm -i -- $(cat list.txt)
またはGNU xargsを使用してください。
xargs -rd '\n' --arg-file=list.txt rm -i --