2009-07-01 12 views
1

最近、私はしばしば、いくつかの行に出力された別のコマンドの出力でいくつかのコマンドを実行したいと思っていました。行を循環するシェルコマンド?

たとえば、新しい行に複数のファイルパスを返すコマンドがあり、これらのファイルをすべて削除したいとします。

これを行うのに役立つコマンドがありますか?あなたが行うことができますbashのようなシェルで

+1

どのような環境ですか? Windows? UNIX? – Joey

答えて

6

あなたがxargsを探しているように聞こえます。 manページから:

xargsは(ダブルまたはシングル引用符やバックスラッシュで保護することができます)空白や改行で区切られた標準入力から引数を読み込み、コマンドを実行します(デフォルトで/ binに/エコー)引数の後に任意のinitial-argumentsを続けて1回以上入力すると、標準入力から読み込まれます。 *.cppファイルを除いて、現在のディレクトリにあるすべてのものを削除します

ls | grep -v '*.cpp' | xargs rm 

上記のコマンド:

だからあなたのようなことを行うことができます。 Windowsの、CMDでは

3

rm `your command` 

または

rm $(your command) 
+1

これは、ファイル名にスペースが含まれるか、リストが長くなり過ぎるまで有効です。 –

3

for /f "usebackq delims=" %i in (`your command`) @del "%i" 

のPowershell:あなたは、スペースを持つラインに問題があることができますが

your command | Remove-Item 
0

cat file | while read i; do echo "working on line $i"; done 

を試してみてください。私はそれを修正する方法を覚えていない。 このコマンドは、すべての操作に対して1行単位で機能することに注意してください。 xargsを使用するのは、あなたが尋ねた例(と同様のケース)でのみ動作しますが、xargsで問題を解決できる場合は、間違いなくそれを行ってください。

+0

あなたはカットを探しています。これにより、最初の列が印刷されます。あなたが好きになったければ、sedやawkをチェックしてください。 http://www.manpagez.com/man/1/cut/ catファイル|読んでいる間はi; do FOO = echo $ i |カット-f1;エコー$ FOO;完了 (EDIT:コメントから回答に移動) – John

1
ls | xargs rm 

1(ファイル内のフレーズのためのディレクトリを検索する)興味深い使用

find /path/to/dir | xargs grep "search text" 

1は関係ありませんが、それはxargsのは、UNIXを想定し

1

をどのように動作するかを示すこと

名前のスペースを処理するには、xargsに-0フラグを使用します。検索で:

find . -name '*.mp3' -print0 | xargs -0 dosomething 

他のいくつかのコマンドは、通常-0または-z、NULで区切られた出力のための各種のスイッチを持っています。行が終了し、空白行をスキップUNIXおよびDOS(とさえマッククラシック)を取り扱い、nulsに改行や改行を変換するためにtrを使用しています

cat filelist | tr -s '\012\015' '\000' | xargs -0 dosomething 

:あなたのリストが行指向である場合には、ような何かを行います。

ほとんどのUNIXライクなファイルシステムでは、改行が有効なファイル名文字であることを忘れないでください。

dosomethingが複雑な場合、あなたはbashの機能を使用することができます。

dosomething() { 
    while [ -n "$1" ] ; do 
     out="$(basename "$1" .mp3).ogg" 
     convert "$1" "converted/$out" 
     shift 
    done 
} 

export -f dosomething 

などxargsを呼び出す:

cat filelist | tr -s '\012\015' '\000' | xargs -0 bash -c 'dosomething "[email protected]"' -- 

注意スペース、およびそれを維持するために、二重引用符の賢明な使用のダブル引用符で囲まれた文字列は、ダブルクォートの$() eval演算子の中にネストすることができます。

機能の中で、あなたがサブプロセスに渡す適切に引用された引数リストを取得するには"[email protected]"を書き込むことができます。

dosomething() { 
    command1 preargs "[email protected]" postargs | command2 
    command3 "[email protected]" 
} 

ます。また、ライン・バイ・ラインを動作するようにreadを使用することができます。

cat filelist | while read i ; do something "$i" ; done 

しかし、xargsはすぐにすべてのargsを取得します。