検索検索でワイルドカードに一致する複数のフォルダを除外する方法

検索検索でワイルドカードに一致する複数のフォルダを除外する方法

次の方法を使用して、 'tmp'と 'logs'で始まるフォルダを除いて、 '/app/test'ディレクトリ内のすべてのファイルとフォルダを見つけたいと思います。prune

だから私は次のコマンドを試しました。

find /app/test -type d \( ! -name logs* \)  -o \( ! -name log \)  -o \( ! -name tmp* \)  -o
\( ! -name tmp \) -prune | tee /tmp/findall.log

ただし、次のように検索結果に含まれる最上位フォルダが表示されます。

/app/test/Admin/tmp/data/pm.trp
/app/test/Admin/tmp/wond/iqc.log
etc ...

何か提案してもらえますか?

答え1

ファイル名ワイルドカードを含む単語を引用しないことに加えて、すべてのテストの意味を反転して、ファイル名-nameワイルドカードを含む名前を切り取りました。いいえ検索ツリーでこれらの名前とパターンを一致させます。

代わりに:

find /app/test -type d \
    \( -name 'logs*' -o -name log -o -name 'tmp*' -o -name tmp \) -prune -o \
    -print | tee /tmp/findall.log

-pruneそれ以外の場合、テストは-printそのポイントに一致するエントリのパス名を印刷し続けます。

答え2

別の方法:

find /app/test -type d \( -path "*/log*" -o -path "*/tmp" \) -prune -o -print | tee /tmp/findall.log

使用時に-pathディレクトリ名全体が一致する必要があるため、*globパターンの前にあるワイルドカード文字を使用してください。

また"*/tmp"、という名前のディレクトリへのパスのみが一致し、またはtmpというディレクトリは一致しません。一方、で始まるディレクトリ名を含むすべてのパスと一致します。tmp2tmporary"*/log*"log

-prunefind括弧内に一致するすべてのディレクトリをスキップします。

関連情報