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

2 ответа2

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 - true.

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