web-dev-qa-db-ja.com

Unixのfindコマンドを使用して、名前に一致するが同じ名前のサブディレクトリではないディレクトリを検索する

編集:問題を誤って伝えました。より正確な例を以下に示します。

ターゲットディレクトリ内のすべてのディレクトリを再帰的にウォークし、最初の.gitディレクトリが見つかった後で各再帰呼び出しを停止したいと思います。

たとえば、次のパスがある場合:

/home/code/Twitter/.git/
/home/code/Twitter/some_file
/home/code/Twitter/some_other_file 
/home/code/facebook/.git/
/home/code/facebook/another_file
/home/code/configs/.git/
/home/code/configs/some_module/.git/
/home/code/configs/another_module/.git/
/home/code/some/unknown/depth/until/this/git/dir/.git/
/home/code/some/unknown/depth/until/this/git/dir/some_file

結果には次の行だけが必要です。

/home/code/Twitter
/home/code/facebook
/home/code/configs
/home/code/some/unknown/depth/until/this/git/dir/

-maxdepthターゲットの各サブディレクトリの最初の.gitディレクトリの深さがわからないため、ここでは役に立ちません。

find /home/code -type d -name .git -Pruneはそれをしますが、それは私にとってはうまくいきません。何が足りないのですか?

7
Gabe Hollombe

あなたが望むように聞こえます -maxdepth オプション。

/ home/code -maxdepth 2 -type d -name.gitを検索します

6
Digital Chris

.gitサブディレクトリを含むすべてのディレクトリを検索します。

find /home/code -type d -name .git -exec dirname {} \;
2

それはトリッキーであり、-maxdepthと再帰のトリッキーはここでは役に立ちませんが、これが私がすることです:

find /home/code -type d -name ".git" | grep -v '\.git/'

英語:「。git」という名前のすべてのディレクトリを見つけて、「。git /」(ドットgitスラッシュ)を含む結果リスト内の出現箇所をすべて除外します。

上記のコマンドラインはすべてのUNIXシステムで機能しますが、検索結果が「GNU検索」であると断言できる場合は、これも機能します。

find /home/code -type d -name ".git" ! -path "*/.git/*"

楽しんで。

2
Paxsali