2012-01-10 7 views
0

複数の行を出力するlinuxコマンドを実行するたびに、出力の各行で何らかの操作を実行したいと思います。一般的に私はそうです

command something | while read a 
do 
    some operation on $a; 
done 

これは問題なく動作します。しかし、私の質問は、私はどのように定義されたシンボル(どのようにそれを呼び出す方法を知っている)///何かのような各行にアクセスすることができますか? ..または.. $! ..か.. $ _

はbashで、定義済みの$ LINEであることが可能

cat to_be_removed.txt | rm -f $LINE 

を行うためにそこ..ですか前のものは、最短の方法です。すなわち、

cat to_be_removed.txt | while read line; do rm -f $line; done; 

答えて

7

xargsあなたが探しているものです:あなたが1つを使用している場合

cat to_be_removed.txt | xargs rm -f 

は、しかし、あなたのファイル名にスペースを付けろ。詳細についてはxargs man pageをご覧ください。

+0

1秒でビートしてください! –

+0

早いタイピングのためによろしいですか?あなたもアップアップしています! –

+2

'xargs rm -f zwol

5

xargsコマンドを検索している可能性があります。

制御引数に加えて、コマンドとオプションでコマンドの引数をとります。その後、通常は空白で分割された標準入力を読み込み、コマンドラインに収まるように、指定された引数と標準入力から読み込まれる 'ファイル名'の数だけコマンドを繰り返し実行するように手配します。

+0

+1の説明。しかし、私はあなたがコマンドを '繰り返し実行する 'と言った部分を取得しませんでした。 'xargs'はコマンドを1回だけ実行しません。 –

+2

@ Jaypalでは、ほとんどのシステムに最大コマンドラインの長さ制限があります。 'xargs'は"正しいこと "を行い、必要ならばその制限を回避するためにコマンドを何度も実行します。 –

+0

ありがとう@CarlNorum。本当にJonの答えをよく読まなかったので、コマンドラインに収まるようにSTDINから多くのファイル名を読み込んだと言った。申し訳ありません。 :) –

2
rm -f $(<to_be_removed.txt) 

これは、rmが複数のファイルを入力できるためです。あなたは一度だけrmを呼び出して、あなたではなく、whileループでパイプを使用するよりも、別のノートでcatまたはxargs

へのパイプを作成する必要はありませんので、それはまた、あなたがサブシェルを避けることができ、それははるかに効率的になりますプロセス置換使って:

while read line; do 
    some operation on $a; 
done < <(command something) 

をあなたはサブシェルを避けることによって得る付加的な利点は、あなたがループ内で変更する変数は同様に彼らの変化した値外ループを維持することです。これは、パイプフォームを使用する場合には当てはまらず、一般的な問題です。

+0

残念ながら、 '$( zwol

+0

+1です。 @ Zack私たちはそれらを使用すべきではない理由はありますか?なぜ可能性は低いのでしょうか? –

+0

@Zackこの質問にbashタグがあると考えると、バシムを使うのはかなり安全だと思います。 – SiegeX

関連する問題