rm -iR 不能在循环内工作

rm -iR 不能在循环内工作

这是我的循环

ls -ltrd * | head -n -3 | awk '{print $NF}' | while read y; do

rm -iR $y

done

输出:

rm:进入目录oct_temp17? rm:进入目录 oct_temp18? rm:进入目录oct_temp19? ....

它不会提示用户确认,理想情况下,手动运行时应该执行 rm -i 。

我在 Linux 3.10 上使用 bash shell

我对 Unix/Linux 很幼稚。您能否建议我如何让脚本要求我确认 ls 输出中的每个文件夹?

答案1

1. 为什么你的例子没有按预期工作

rm的提示需要 STDIN 才能接收您的反馈。在您的示例中,您使用 STDIN 将列表通过管道传输到while循环,因此从//命令而不是用户rm获取提示的答案。lsheadawk

解决方案是不使用 STDIN 向循环提供列表 - 例如:

for y in $(ls -ltrd * | head -n -3 | awk '{print $NF}'); do
  rm -iR $y
done

2. 更安全的方法

准备好包含空格的文件名(您不需要awk,要获取文件名,您只需告诉ls仅在第一个位置打印文件名):

IFS=
for y in $(ls -1qtrd * | head -n -3); do
  rm -iR "$y"
done

3. 更简单的方法

正如Archemar 指出的:你甚至不需要循环(只要文件名中没有空格)。

rm -iR $(ls -1qtrd * | head -n -3)

相关内容