ディレクトリ/ファイルの組み合わせを検索することは可能ですか?


12

ABC.jpgという名前の画像を見つける必要があります。この画像は、ABC_MPSCという名前のディレクトリにプログラムで配置されることがわかっています。私はもう試した:

cd /
find . -name "ABC_MPSC/ABC.jpg"

しかし、それは何も返しません(私が実際に検索している特定のものがどこにあるかを知っているので、それが存在することを知っています)。手動で検索する必要のない検索コマンドはありますか?



2
またlocate、を使用して検索することもできますが、これは非常に高速ですupdatedbが、最後に実行されたときにファイルがすでに存在していた場合にのみ機能します。
サイモンリヒター

回答:


17

-pathここに役立つ述語があります:

find . -path '*/ABC_MPSC/ABC.jpg'

その述部のPOSIX 記述は次のとおりです。

プライマリは、パターンマッチング表記法で説明されているパターンマッチング表記法を使用して、現在のパス名がパターンに一致する場合、trueと評価するものとします。これは一致する操作であり、展開ではないため、「ファイル名の展開に使用されるパターン」の追加ルールは適用されません。

あなたが-name "ABC_MPSC/ABC.jpg"失敗した理由は、-name述語が原因です:

現在のパス名のベース名がパターンに一致する場合、trueと評価されます。

言い換えれば、-name見たことがないディレクトリ(たとえば、ABC.jpg)現在のファイル名の、唯一の基本ファイル名そのものを。


10

2つの方法(を使用する以外-path):

  1. ディレクトリを探して、ファイルを検出します。

    find / -type d -name 'ABC_MPSC' -exec test -f {}/ABC.jpg \; -print
    

    これは、連結されている場合でも、見つかったディレクトリの現在のパス名findに展開{}する実装に依存しています/ABC.jpg(そうする必要はありません)。次のように書くこともできます

    find / -type d -name 'ABC_MPSC' \
        -exec sh -c 'test -f "$1"/ABC.jpg' sh {} \; -print
    
  2. ファイルを探してから、その親ディレクトリ名を確認します。

    find / -type f -name 'ABC.jpg' -exec sh -c '
        case $(dirname "$1") in
            */ABC_MPSC) exit 0 ;;
            *) exit 1
        esac' sh {} \; -print
    

これらの代替案はどちらも、-pathジェフが示すように使用するよりも時間がかかります。それらは他の事柄に適応する可能性があるので、例としてここに残しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.