2012-04-06 78 views
1

我有rm -i在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 

做,但我得到的錯誤「壞替代」。

回答

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以外的任何地方讀取。

+0

但是,這並不與問題解決的問題,可以」不會回答,是嗎? – svick 2012-04-06 14:43:28

+0

很對,忘了重要的一部分...(我認爲有比這個tty重定向更好,但現在找不到它) – Mat 2012-04-06 14:47:30

+0

謝謝你的墊子,它的工作原理。但是 user1317639 2012-04-07 02:01:10

0

試試這個

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

如果find是不是絕對的要求,你可以用一個簡單的glob代替它:

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