検索からディレクトリを除外

検索からディレクトリを除外

find/mnt私はそれを使用するたびに常に完全に謎です。検索から除外したいのですが(WSLのUbuntu 20.04ではbashにあるので、Windows空間で検索したくありません)find誤って進みます。そのディレクトリに入り、私を完全に無視します。このページで構文が見つかりました。https://stackoverflow.com/questions/4210042/how-to-exclude-a-directory-in-find-commandすべてのバリエーションを試しましたが、すべて失敗しました。

sudo find / -name 'git-credential-manager*' -not -path '/mnt/*'
sudo find / -name 'git-credential-manager*' ! -path '/mnt/*'
sudo find / -name 'git-credential-manager*' ! -path '*/mnt/*'

これによりエラーが発生し/mnt、エラーが発生します(上記の構文は明確に見え、スタックオーバーフローページの構文は正しいと思われるので本当に残念です)。

find: ‘/mnt/d/$RECYCLE.BIN/New folder’: Permission denied
find: ‘/mnt/d/$RECYCLE.BIN/S-1-5-18’: Permission denied

find誰かが私のディレクトリ除外スイッチを無視するのをやめる方法を教えてもらえますか?

答え1

検索は-pathパスを除外しません。これは、「名前がこのパスに一致するものを報告しない」を意味します。それでもディレクトリにドロップダウンして検索されます。あなたが望むもの-prune(からman find):

       -prune True;  if  the file is a directory, do not descend into it.  If
              -depth is given, then -prune has no  effect.   Because  -delete
              implies  -depth, you cannot usefully use -prune and -delete to‐
              gether.  For example, to skip the directory src/emacs  and  all
              files  and  directories  under  it,  and print the names of the
              other files found, do something like this:
                  find . -path ./src/emacs -prune -o -print

だからあなたは以下が欲しい:

sudo find / -path '/mnt/*' -prune -name 'git-credential-manager*' 

-mount除外するターゲットによっては、(GNU find)または(その他)を使用する方が-xdev簡単かもしれません。

からman find

-mount他のファイルシステムのディレクトリをダウングレードしないでください。-xdev他の find バージョンとの互換性のための代替名です。

だから:

sudo find / -mount -name 'git-credential-manager*' 

答え2

このオプションは無視されません。述語は、-path見つかったすべてのファイルに対して評価され、そのツリー内のファイルに対しては失敗します。これは、ディレクトリツリーのナビゲーション方法に影響を与えず、外部のすべての項目だけでなく、その中にあるファイルにも一致するようなものをfind持つことができます。find . ! -path "./foo/*" -o -name '*.txt'foo*.txt

これGNUのマニュアルページここで何をすべきかは非常に明確です-prune。代わりに、以下を使用してください。

-path pattern
...ディレクトリツリー全体を無視するには、-pruneツリー内のすべてのファイルを確認する代わりに使用してください。たとえば、ディレクトリsrc/emacsとその下のすべてのファイルとディレクトリをスキップして、見つかった他のファイルの名前を印刷するには、次の手順を実行します。

find . -path ./src/emacs -prune -o -print

関連情報