7

Отредактировано: я ошибочно представил мою проблему. Более точный пример теперь появляется ниже.

Я хотел бы рекурсивно пройти все каталоги внутри целевого каталога и остановить каждый рекурсивный вызов после того, как найден первый каталог .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 dir для каждого подкаталога моей цели.

Я думал, что find /home/code -type d -name .git -prune сделает это, но у меня это не работает. Что мне не хватает?

3 ответа3

6

Похоже, вы хотите опцию -maxdepth .

find /home /code -maxdepth 2 -тип d -имя .git

2

Найдите все каталоги, которые содержат подкаталог .git:

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

Это сложно, а -maxdepth и рекурсивный обман здесь не помогут, но вот что я бы сделал:

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

На английском: найдите мне все каталоги с именем «.git» и отфильтруйте все вхождения в списке результатов, которые содержат «.git/» (точка git slash).

Вышеупомянутая командная строка будет работать на всех системах Unix, однако, если вы можете утверждать, что ваша находка будет "GNU find", то это также будет работать:

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

Повеселись.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .