検索がどのように機能しないのか理解できません。
ツリー内のすべての.gitdirを見つけたいとしましょう。
find -type d -iname .git
問題ありませんが、含まれたくないdirがいくつかあるとしましょう。問題は、「古い」および「バックアップ」と呼ぶことができます。
Grep -vにパイプすることができ、それは問題なく機能します。
find -type d -iname .git | grep -v old | grep -v backup
しかし、manページを閲覧して見つけたところ、-notがあることに気づきましたが、それがどのように機能するのか理解できません。
私はこのように試しましたが、彼は古いディレクトリを除外していません。
find -type d -iname .git -not -iname old
検索はどのように機能しませんか?この問題の発見に使用できますか?
findには、このケースに対処するための少し洗練された機能があります。
式に
-Prune
以外のアクションが含まれていない場合、式がtrueであるすべてのファイルに対して
したがって、必要な部分だけを明示的に印刷します。
find -type d \( -iname old -Prune -o -iname backup -Prune -o -iname .git -print \)
古いツリーとバックアップツリーの検索をまったく回避します。
find
の-Prune
オプションが必要です。これは非常に注意が必要です。 -path
の代わりに-name
も使用する必要があります。
私はあなたがこれを使いたいと思います:
find . -type d \( -path '*/old' -Prune -o -iname '.git' -print \)
-not
の効果はによって実装されます
-print
がすでに使用されている場合、findの通常のデフォルトアクションであるコマンドラインの最後の暗黙的な-print
は無効になっているため)他のバリアントは、コマンドラインではlookingより複雑ですが、たとえば、異なる論理式の使用やデフォルトのアクションの変更などにより、使いやすい場合があることを認識しています。
一方、-Prune
を含むバリアントは、読むのに時間がかかりすぎるという理由だけで他の構文を処理するのが難しい、より複雑なケースに一般化するのが簡単です。
-path
を指定すると、ディレクトリを除外できます。
find . -type d \( -iname .git ! -path "*/old/*" ! -path "*/backup/*" \)
-not
in GNU find
は!
と同じですが、POSIXに準拠していないことに注意してください。
man find
からの引用:
! expr True if expr is false. This character will also usually need
protection from interpretation by the Shell.
-not expr
Same as ! expr, but not POSIX compliant.
find -type d -iname .git -not -iname old
これは、.git
と呼ばれ、old
とは呼ばれないディレクトリと一致します。 .git
というディレクトリはold
とは呼べないので、コマンドの意味を変えずに-not -iname old
の部分を削除できます。
-not
は「一致しない」と言っていますが、「再発しない」とは言っていません。 「再発しない」という別の言い方があります。それは-Prune
と呼ばれるアクションです。次のコマンドは、「すべてのディレクトリを再帰的にトラバースしますが(find
)、old
(-iname old -Prune
)というディレクトリで停止し、.git
というディレクトリを出力します」という意味です。
find -iname old -Prune -o -type d -iname .git -print
これは( -iname old -Prune ) -o ( -type d -iname .git -print )
として解析されます。検索は、-iname old
または(-o
)-type d -iname .git
の条件を満たすファイルを探すように指示されます。ファイルが最初の条件を満たすと、アクション-Prune
(トラバースされたツリーから削除する、つまり再帰しない)が実行されます。ファイルが2番目の条件を満たすと、アクション-print
が実行されます。印刷がデフォルトのアクションであるため、-print
を省略できます。