1

我在 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

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

4

3 回答 3

3

在 Linux 上:

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

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

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

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

两者之间的区别:第一个总是尝试(并且可能失败)从控制中读取tty。另一个将从stdin循环之外的任何内容中读取。

于 2012-04-06T14:39:24.247 回答
0

试试这个

OIFS="$IFS"
IFS='
'
declare -a ar=($(find . -name '*.tex'))
IFS="$OIFS"
for x in "${ar[@]}"
 do
  rm -i "${x%%tex}aux"
 done
于 2012-04-06T22:05:00.970 回答
0

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

for f in ../*.tex; do
    rm -i ${f%%tex}aux
done
于 2012-04-06T23:18:34.980 回答