Как рекурсивно найти папки в системе Linux, которая содержит только папки?

487
Bob Ortiz

Я пытаюсь разработать команду, которая рекурсивно находит каталоги, которые содержат только один или несколько каталогов на одном уровне. Желательно с findкомандой. Как find . -type d.

Например, в следующей файловой структуре:

/tmp/folder1/folder1a/test.jpg /tmp/folder1/file1a.tmp /tmp/folder2/folder2a/test.jpg /tmp/folder3/folder3a/ /tmp/folder3/folder3b/file.jpg 

Я хотел бы остановиться folder2и folder3только потому, что он не содержит сами файлы, он содержит только папки (с файлами).

0

2 ответа на вопрос

3
Andrew Domaszek

comm -23 <(find . -type d ! -empty | sort -u) <(find . -type f -printf '%h\n' | sort -u)

Это список непустых папок (по крайней мере, одна вещь в нем), за исключением тех, которые содержат какие-либо файлы. Если вы также хотите исключить такие вещи, как каналы и символические ссылки, вы можете использовать ! -type dвместо -type f. Это нельзя сделать одним оператором поиска, так как поиск не может соответствовать по сложным критериям содержимого (это не XPath).

2
Kamil Maciorowski

Если я вас правильно понял, это должно сделать это:

find . -type d ! -empty -exec sh -c '\ [ -z "`find "$1" -maxdepth 1 -mindepth 1 ! -type d -print -quit`" ]\ ' sh {} \; -print 

Из - за -empty, -maxdepth, -mindepthи -quit, которые не находятся в POSIX, решение не может работать в вашей ОС ( -print -quitтолько чтобы ускорить процесс, вы можете пропустить этот фрагмент, -maxdepth 1 -mindepth 1имеет важное значение, хотя).

Хитрость заключается в том, чтобы запустить отдельную оболочку для каждого непустого каталога, который проверяет (не рекурсивно), не содержит ли каталог никаких не-каталогов. Это сделано с -exec sh … \;, это действует как тест здесь. Если каталог не содержит не-каталога, то выход из внутреннего findпуст, так что тест ( [ -z … ]) возвращает статус выхода 0, shвозвращается 0, -execправда.

Похожие вопросы