rm -i在循环中

时间:2012-04-06 14:34:56

标签: bash

我在for循环中有rm -i但是当我运行它时,会打印出问题(“你想删除吗?”但是不要停下来让我回答。

find .. -name "*.tex" | while read line; do
    printf "${line%%tex}""aux" | xargs rm -i
done

我该如何解决这个问题?

此外,我最初尝试使用exec这样做

find ..-name "*.tex" -exec printf "${{}%%tex}""aux"\; | xargs rm -i

但我收到错误“错误替换”。

3 个答案:

答案 0 :(得分:2)

在Linux上:

find .. -name "*.tex" | while read line; do
    rm -i "${line%%tex}aux" < /dev/tty
done

如果您只有一个参数,则不需要使用xargs,但是您确实需要在循环内部以某种方式访问​​原始tty。上面的工作在Linux上,在其他系统上可能有类似的技巧。

另一种(可能更便携)的方法是在进入while循环之前“保存”stdin(假设你没有将fd 9用于其他目的):

exec 9<&0
find .. -name "*.tex" | while read line; do
    rm -i "${line%%tex}aux" <&9
done

两者之间的区别:第一个将始终尝试(并且可能失败)从控制tty读取。另一个将从循环外的stdin读取。

答案 1 :(得分:0)

试试这个

OIFS="$IFS"
IFS='
'
declare -a ar=($(find . -name '*.tex'))
IFS="$OIFS"
for x in "${ar[@]}"
 do
  rm -i "${x%%tex}aux"
 done

答案 2 :(得分:0)

如果find不是绝对要求,可以用简单的glob替换它:

for f in ../*.tex; do
    rm -i ${f%%tex}aux
done