2013-09-11 13 views
11

現在のディレクトリで、ファイル名とその中の内容を印刷したいと思います。 私はxargs複数のコマンドで

find . | grep "file_for_print" | xargs echo 
find . | grep "file_for_print" | xargs cat 

によって個別のファイル名や内容を印刷することができますが、私がしたいことは、このようにそれらを一緒に印刷されています

file1 
line1 inside file1 
line2 inside file1 
file2 
line1 inside file2 
line2 inside file2 

私は「xargs with multiple commands as argument を読み、

find . | grep "file_for_print" | xargs -I % sh -c 'echo; cat;' 

が、doesnのを試してみました仕事。 私はxargsに慣れていないので、正確に "-I%sh -c"とは何を意味するのか分かりません。 誰でも助けてくれますか?ありがとうございました!で開始する

+0

これを試してみてください.....私は、これは、助けるべきだと思う「見つける|。grepを 『file_for_print』 | xargsのは、より多くの」 – nsd

答えて

14

は、間にほとんど差がない。二番目はthis_is_not_the_file_for_printのようにファイル名と一致しないことを除いて

find . | grep "file_for_print" | xargs echo 

find . -name "file_for_print*" 

、そしてそれは、ファイル名を一のあたりを印刷しますライン。 grepが大部分を破棄するためには、再帰的なディレクトリ構造全体を生成して出力する必要がないため、処理時間が大幅に短縮されます。

find . -name "file_for_print*" 

は実際

-print作用が改行に続く各マッチファイル名を印刷
find . -name "file_for_print*" -print 

と全く同じです。 findにアクションを指定していない場合は、-printが必要と仮定します。しかし、それはそれよりも袖の上に多くのトリックを持っています。たとえば:

find . -name "file_for_print*" -exec cat {} \; 

-exec行動の原因は、各一致するファイル名を指定して{}を置き換え、\;まで、次のコマンドを実行するために見つけます。

findは、単独の動作に限定されません。しかし、あなたが望む多くのことをすることができます。だから:

find . -name "file_for_print*" -print -exec cat {} \; 

おそらくあなたが望むものをうまくいくでしょう。この非常に便利なユーティリティの多くの詳細については

、タイプ:

man find 

または

info find 

とそれについてのすべてをお読みください。

+5

1は、おそらく最も優しく;-) RTFMを配信 – necromancer

+0

ええ見つけるとxargsのですかなり素晴らしい。 – sashang

16

find . | grep "file_for_print" | xargs -I % sh -c 'echo %; cat %;'何独自のbashの機能を書くことについて

+1

まさに私が探していたもの!ありがとうございました! – John

+0

助けてくれてうれしいです:-) – necromancer

0

(OPは%秒行方不明になりましたか)?

#!/bin/bash 

myFunction() { 
    while read -r file; do 
     echo "$file" 
     cat "$file" 
    done 
} 

find . -name "file_for_print*" | myFunction 
6

それはまだ言われていないので:-I %は、あなたがそれを与えるコマンドで引数に「%」を置換するxargsのを伝えます。 sh -c '...'は、新しいシェルに'...'というコマンドを実行するという意味です。

ので

xargs -I % sh -c 'echo %; cat %;' 

xargsに与えられたすべてのファイル名にcat [filename]続いecho [filename]を実行します。 echoコマンドとcatコマンドは異なるシェルプロセスの中で実行されますが、これは通常問題ではありません。 xargsに渡されたコマンドの内部に%記号がないため、バージョンが機能しませんでした。それは(parallelが自動的に置換文字として{}使用すると、デフォルトでは、複数のコマンドを取ることができます)簡単ですので

find -name "*file_for_print*" | parallel 'echo {}; cat {};' 

:それは私が同じことを達成するために、このコマンドを使用する価値がある何のため


0

この場合、各コマンドは個々のファイルごとに実行されるため、xargsを使用する利点はありません。この場合-print

find . -name "*file_for_print*" -exec echo {} \; -exec cat {} \; 

がRICIによって指摘最初 echoなどの代わりに使用することができるが、この例では2つの任意のコマンドを実行する能力を示しています。あなたは自分の「検索」に二回-exec追加します単一 find

関連する問題