最近、私はしばしば、いくつかの行に出力された別のコマンドの出力でいくつかのコマンドを実行したいと思っていました。行を循環するシェルコマンド?
たとえば、新しい行に複数のファイルパスを返すコマンドがあり、これらのファイルをすべて削除したいとします。
これを行うのに役立つコマンドがありますか?あなたが行うことができますbashのようなシェルで
最近、私はしばしば、いくつかの行に出力された別のコマンドの出力でいくつかのコマンドを実行したいと思っていました。行を循環するシェルコマンド?
たとえば、新しい行に複数のファイルパスを返すコマンドがあり、これらのファイルをすべて削除したいとします。
これを行うのに役立つコマンドがありますか?あなたが行うことができますbashのようなシェルで
あなたがxargs
を探しているように聞こえます。 manページから:
xargsは(ダブルまたはシングル引用符やバックスラッシュで保護することができます)空白や改行で区切られた標準入力から引数を読み込み、コマンドを実行します(デフォルトで/ binに/エコー)引数の後に任意のinitial-argumentsを続けて1回以上入力すると、標準入力から読み込まれます。
*.cpp
ファイルを除いて、現在のディレクトリにあるすべてのものを削除しますls | grep -v '*.cpp' | xargs rm
上記のコマンド:
だからあなたのようなことを行うことができます。 Windowsの、CMDでは
:
rm `your command`
または
rm $(your command)
これは、ファイル名にスペースが含まれるか、リストが長くなり過ぎるまで有効です。 –
:
for /f "usebackq delims=" %i in (`your command`) @del "%i"
のPowershell:あなたは、スペースを持つラインに問題があることができますが
your command | Remove-Item
は
cat file | while read i; do echo "working on line $i"; done
を試してみてください。私はそれを修正する方法を覚えていない。 このコマンドは、すべての操作に対して1行単位で機能することに注意してください。 xargsを使用するのは、あなたが尋ねた例(と同様のケース)でのみ動作しますが、xargsで問題を解決できる場合は、間違いなくそれを行ってください。
あなたはカットを探しています。これにより、最初の列が印刷されます。あなたが好きになったければ、sedやawkをチェックしてください。 http://www.manpagez.com/man/1/cut/ catファイル|読んでいる間はi; do FOO = echo $ i |カット-f1;エコー$ FOO;完了 (EDIT:コメントから回答に移動) – John
ls | xargs rm
1(ファイル内のフレーズのためのディレクトリを検索する)興味深い使用
find /path/to/dir | xargs grep "search text"
1は関係ありませんが、それはxargsのは、UNIXを想定し
をどのように動作するかを示すこと
名前のスペースを処理するには、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を取得します。
どのような環境ですか? Windows? UNIX? – Joey