質問: "find"を使って特定のファイル名を無視するにはどうすればいいですか? 私のお気に入りのbashコマンドのひとつは、find . -name '*.*' -exec grep 'searchstring' {} /dev/null \; 指定されたsearchstringについて、現在のディレクトリ以下のすべてのファイルの内容を検索します。開発者として、これは時々便利になりました。私の現在のプロジェクトと私のコードベースの構造のために、しかし、私は "。svn"を含むディレクトリの中または下にあるファイル、またはそれを含むファイルを検索しないことによってこのbashコマンドをさらにもっともっとしたい".html"で終わる見つけるためのmanページは私を混乱させます。私は-pruneを使ってみましたが、奇妙な振る舞いをしました。 (開始するために).htmlページだけをスキップしようとして、私は試してみました。find . -wholename './*.html' -prune -exec grep 'searchstring' {} /dev/null \; そして私が望んでいた行動を得られませんでした。私は-pruneのポイントを見逃しているかもしれないと思います。あなたは私を助けてもらえますか?ありがとう
回答: 次のfindコマンドは、名前に.svnが含まれているディレクトリをpruneします。ディレクトリには降りませんが、整理されたパス名が出力されます(-name '*.svn'が原因です)。 。:grep -d skipでディレクトリ名を除外することができます。これはそのような入力「ディレクトリ名」を黙ってスキップします。gnu grepでは、-hの代わりに/dev/nullを使用できます。ちょっとした副次的な問題として、\+は\;よりはるかに速い可能性があります。 100万行のファイルでは、\;を使用すると4m20s、\+を使用すると1.2sしかかかりませんでした。次の方法では、-execの代わりにxargsを使用し、どのファイルの名前にも改行\nがないと仮定します。ここで使用されているように、xargsはfindの\+とほとんど同じです。xargsは、'\n'オプションを使用して入力区切り文字を-dに変更することによって、連続したスペースを含むファイル名を渡すことができます。これは、名前が.svnを含み、.htmlで終わらないファイルのみをgrepsするディレクトリを除外します。find . \( -name '*.svn*' -prune -o ! -name '*.html' \) | xargs -d '\n' grep -hd skip 'searchstring'