リストからファイルを対話的に削除する

リストからファイルを対話的に削除する

ファイルリストを削除して確認を要求したいです。リストはlist.txtファイルにあります。次のコマンドが正しく機能しないのはなぜですか?

while read i; do rm -i $i; done < list.txt

前のコマンドは私を待ちませんが、幸いにもファイルは削除されません。

バッシュを使っています。

ベストアンサー1

rm -iwhileループから継承された標準入力から回答を読みます。したがって、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 --

おすすめ記事