Поиск во всех подкаталогах с 0 файлами

Поиск во всех подкаталогах с 0 файлами

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

$ ls -p | grep -v / | wc -l | \
  xargs -I % test % -eq 0 && pwd

Я думаю, что может быть более элегантное решение, есть предложения? И как мне изменить его, чтобы рекурсия прошла по всем подкаталогам?

У меня есть тестовая структура: test/test1/test4 и test/test2/test3/test5. Единственный файл находится в test/test1. Я хочу запустить команду в базовом каталоге (test/). Результаты должны быть следующими: test/ ; test/test2/ ; test/test2/test3/, поскольку это каталоги, которые содержат только подкаталоги, но не файлы. Дополнительными приемлемыми будут пустые конечные точки test/test1/test4/ и test/test2/test3/test5.

решение1

Использование fgrep для фильтрации каталогов с файлами:

$ find -type d | \
  grep -xFv -f <(find -type f -printf %h\\n)

решение2

Что-то вроде этого:

find . -type d -exec bash -c 'files=$(find $1 -mindepth 1 -maxdepth 1 -type f | wc -l) ; [[ $files -ne 0 ]] && exit 1 ; exit 0' script {} \; -print

Это bash -c ...просто «небольшой» скрипт, который возвращает 0 или 1 после проверки файлов в каталоге.

решение3

Другой подход к проблеме:

# Enable advanced glob
shopt -s globstar
# Enable matching hidden files (.*)
shopt -s dotglob
for d in **/; do
   nofiles=true
   for f in "$d"/*; do
     [ -f "$f" ] && nofiles=false && break
   done
   [ $nofiles = true ] && echo "$d"
done
shopt -u globstar
shopt -u dotglob

Пройдитесь по всем папкам, внутри них просмотрите все элементы и проверьте наличие файлов.

Не самый короткий скрипт, но не подведет на новых строках, пробелах и т. п. в именах файлов. И его легко читать, когда вы снова смотрите на него через 5 лет ;-)

Связанный контент