从列表中交互式删除文件

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)

  • 不只是 `y`,而是任何以 `y` 开头的名字。显然,`rm` 只查看它收到的任何响应的第一个字符:'y' 是肯定的,其他的都是否定的。 (5认同)