13 shell bash io-redirection rm
我想删除文件列表并要求确认。该列表在list.txt文件中。为什么下面的命令不能正常工作?
while read i; do rm -i $i; done < list.txt
Run Code Online (Sandbox Code Playgroud)
前面的命令没有等待我,但幸运的是没有文件被删除。
我正在使用 Bash。
che*_*ner 20
rm -i从标准输入读取它的答案,它从while循环继承。所以一行文本list.txt被用作“真的删除?”的答案。题。要修复,您需要将两个输入源分开。最简单的方法是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
Run Code Online (Sandbox Code Playgroud)
您不再为 while 循环重定向标准输入 (fd 0),因此rm将根据需要从终端读取。
或者,您可以这样做:
IFS=$'\n' # set field separator to newline
set -f # disable globbing upon command substitution
rm -i -- $(cat list.txt)
Run Code Online (Sandbox Code Playgroud)
或者,使用 GNU xargs:
xargs -rd '\n' --arg-file=list.txt rm -i --
Run Code Online (Sandbox Code Playgroud)