web-dev-qa-db-ja.com

特定のパターンに一致するすべてのファイルを再帰的に検索する

このパターンに一致するすべてのファイルを見つける(または、より具体的にはカウントする)必要があります。

*/foo/*。doc

最初のワイルドカードのアスタリスクには、可変数のサブディレクトリが含まれます。

40
pw222

Gnu findを使用すると、正規表現を使用できます(-name)パス全体に一致:

find . -regex '.*/foo/[^/]*.doc'

ファイルの数だけを数えるには:

find . -regex '.*/foo/[^/]*.doc' -printf '%i\n' | wc -l

%iフォーマットコードにより、findはファイル名の代わりにiノード番号を出力します。ファイル名とは異なり、inode番号には改行のような文字がないことが保証されているため、カウントの信頼性が高くなります。提案してくれた@tripleeeに感謝します。)

ただし、それがOSXで機能するかどうかはわかりません。

41
rici

どうですか:

find BASE_OF_SEARCH/*/foo -name \*.doc -type f | wc -l

これがしていること:

  • bASE_OF_SEARCH /ディレクトリから開始
  • ディレクトリfooを持つすべてのディレクトリを調べます
  • * .docのような名前のファイルを探します
  • 結果の行を数えます(ファイルごとに1つ)

この方法の利点:

  • 再帰的でも反復的でもない(ループなし)
  • 読みやすく、スクリプトに含めると解読しやすくなります(正規表現がそうでない場合もあります)。

更新:可変深度が必要ですか? OK:

find BASE_OF_SEARCH -name \*.doc -type f | grep foo | wc -l

  • bASE_OF_SEARCHディレクトリから開始
  • * .docのような名前のファイルを探します
  • 「foo」を含むこの結果の行のみを表示します
  • 結果の行を数えます(ファイルごとに1つ)

オプションで、ファイル名に「foo」が含まれる結果を除外することもできます。これにより、結果も表示されるためです。

9
MonkeyWidget

他のページのこのページの回答に基づいて、以下をまとめることができました。現在のフォルダーとその下のすべてで、拡張子がpdfであり、その後に続くすべてのファイルで検索が実行されますタイトルにtest_textを含むもののフィルタリング。

find . -name "*.pdf" | grep test_text | wc -l
2
Teo Tsisme

未テストですが、試してください:

find . -type d -name foo -print | while read d; do echo "$d/*.doc" ; done | wc -l

すべての「foo」ディレクトリを(さまざまな深さで)検索します(これがシンボリックリンクを無視するのは、それが問題の一部である場合は追加できます)。 Shell Globbingを使用して、すべての「.doc」ファイルを検索し、それらをカウントします。

2
mpez0