2012-04-06 10 views
1

forループ内にrm -iがありますが、実行すると質問を印刷します(「これを削除しますか?」と回答します)。ループ内のrm -i

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

私はこれをどのように修正すればよい?

また、私はもともとそう

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上で動作しますが、おそらく他のシステムにも同様のトリックがあります。

これを実行する別の(おそらくより多くのポータブル)の方法は、(あなたが他の目的のためのFD 9を使用していないと仮定した場合)、whileループに入る前にstdinを「保存」することです:2の間

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

違い:最初のものは常に、制御ttyからの読み取りを試みます(そして失敗する可能性があります)。他の人は、stdinがループ外にあったものから読み込みます。

+0

しかし、それができる」質問の問題を解決しません答えてくれますか? – svick

+0

かなり正しいですが、重要な部分を忘れました...(私はこのttyリダイレクトよりも良いと思いますが、今すぐ見つけることができません) – Mat

+0

Thanks Mat、それが動作します。しかし、 user1317639

0

findが絶対条件ではない場合、あなたは簡単なグロブに置き換えることができ、この

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

をお試しください:

for f in ../*.tex; do 
    rm -i ${f%%tex}aux 
done 
関連する問題