xenserverで作業していて、ディレクトリにある各ファイルに対してコマンドを実行し、コマンドの出力からいくつかのものをgreppingしてファイルに追加したいと考えています。
使用したいコマンドと、必要に応じて文字列をgrepする方法は明確です。
しかし、はっきりしないのは、各ファイルでこのコマンドを実行して、ファイルが見つからなくなるまで次のファイルに進む方法です。
xenserverで作業していて、ディレクトリにある各ファイルに対してコマンドを実行し、コマンドの出力からいくつかのものをgreppingしてファイルに追加したいと考えています。
使用したいコマンドと、必要に応じて文字列をgrepする方法は明確です。
しかし、はっきりしないのは、各ファイルでこのコマンドを実行して、ファイルが見つからなくなるまで次のファイルに進む方法です。
回答:
grep $PATTERN *
十分です デフォルトでは、grepはすべてのサブディレクトリをスキップします。ただし、それらをgrepしたいgrep -r $PATTERN *
場合はそうです。
grep $PATTERN *.cpp *.h
。どのファイルをgrepするかについてより具体的なルールが必要な場合は、find
コマンドを使用します(Robの回答を確認してください)。
grep -r x .
すると、すべての拡張子のすべてのファイルから結果が返されます。実行した場合grep -r x *.scss
、結果は得られません。
*.scss
現在のディレクトリにファイルがない可能性がありますが、サブディレクトリのどこかに深いため、grepは必要なすべてのファイルを調べません。--include
オプションを使用して、特定のパターンに一致するファイルを再帰的に検索するようにgrepに指示する必要がありますgrep -r x --include '*.scss' .
(引用符に注意してください。これにより、パターンがシェルによって展開されなくなります)。または単に使用しますfind
(Robの回答を参照)。
検索を使用します。真剣に、それはあなたがそれが実際にそれが操作しているファイルを見ることができるので最良の方法です:
find . -name "*.sql" -exec grep -H "slow" {} \;
-HはMac固有であり、結果にファイル名を表示します。
xargs
使用するよりも出力をパイプ処理する方-exec
がはるかに高速に-exec
なります。ファイル名のスペースに関する標準の警告がに適用されxargs
ます。
xargs
構文を忘れます。
find . -iname "*.sql" -print0 | xargs -0 grep "slow"