
'ファイルcheck_dns
内のどこで定義されているかを見つけようとしていますが、ファイルは数多くあります。nagios
commands.cfg
一致を検索するようなものを実行できることはわかっていますが、可能であれば、インデックス化されたコピーであり、はるかに高速であるため、find / -name "command.cfg" -exec grep check_dns {} \;
使用したいと思います。locate
実行するとlocate commands.cfg
次の結果が得られます。
/etc/nagios3/commands.cfg
/etc/nagiosgrapher/nagios3/commands.cfg
/usr/share/doc/nagios3-common/examples/commands.cfg
/usr/share/doc/nagios3-common/examples/template-object/commands.cfg
/usr/share/nagiosgrapher/debian/cfg/nagios3/commands.cfg
/var/lib/ucf/cache/:etc:nagiosgrapher:nagios3:commands.cfg
xargs
それぞれの結果を取得できるように、locate を実行してそれをインライン コマンドなどにパイプすることは可能ですかgrep
? これは for ループで実行できることはわかっていますが、この特定のケースでそれを実行する方法よりも、ここでは bash-fu / shell-fu をいくつか習得したいと考えています。
答え1
はい、これに使用できますxargs
。
たとえば、単純なもの:
$ locate commands.cfg | xargs grep check_dns
(grep
複数のファイルを検出すると、各ファイルを検索し、一致するファイル名の印刷を有効にします。)
または、次のようにしてファイル名の印刷を明示的に有効にすることもできます。
$ locate commands.cfg | xargs grep -H check_dns
(念のため、grep
1つの引数のみで呼び出されますxargs
)
ファイル名引数を 1 つだけ受け入れるプログラムの場合 ( とは異なりますgrep
)、次のように指定する引数の数を制限できます。
$ locate commands.cfg | xargs -n1 grep check_dns
一致した行の元となるファイルの名前は印刷されません。
結果は次のようになります:
$ locate commands.cfg | xargs grep -h check_dns
最新のlocate/xargsを使用すると、空白の問題からも保護できます。
$ locate -0 commands.cfg | xargs -0 grep -H check_dns
(デフォルトでは空白で入力が区切られますがxargs
、ファイル名に空白が含まれている場合は当然問題になります...)