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

0

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

Боб Ортис
источник

Ответы:

3

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

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

Андрей Домашек
источник
2

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

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правда.

Камиль Мачоровски
источник