Во многих системах Unix вы можете сделать что-то вроде
find . -type d ! -empty
В системе AIX -empty, похоже, не распознается. Любые идеи о том, как я мог бы сделать то же самое?
Во многих системах Unix вы можете сделать что-то вроде
find . -type d ! -empty
В системе AIX -empty, похоже, не распознается. Любые идеи о том, как я мог бы сделать то же самое?
У Дана МакГа правильная идея. Это работает:
find . -type d -links 2 -exec sh -c '[ -z "$(ls -UA "$1/" )" ]' dummy {} \; -print
-links 2 экономит время, исключая каталоги с подкаталогами, потому что если AIX похож на большинство систем Unix, единственные ссылки, которые может иметь каталог, это его собственные. запись, и .. записи в ее подкаталогах.
ls -UA не заботится о сортировке (-U) и не нуждается в статистике файлов, просто выводит то, что получает из readdir, так что это не так уж плохо. -А пропускает. и .., поэтому, если вывод - пустая строка, каталог был пуст.
Если вы все равно вызываете sh -c, вы можете делать то, что вам нужно для per-empty-directory, прямо в sh, вместо того, чтобы использовать вывод find -print0. Жаль, что не-GNU find не имеет -exec {} + (т. Е. Встроенный xargs).
Возможно, если вы обработаете вывод find, вы сможете сделать это более эффективно. например, если вы видите две директории подряд без файла, то у вас есть пустой каталог? все же не так уж и медленно запускать sh -c и ls для каждого каталога.
Во-первых, пусто не указано для поиска в стандарте POSIX, поэтому не все версии поддерживают его.
Я не уверен, как именно это сделать, но это может указать вам направление, чтобы решить это.
find . -type d -exec command '{}' \;
Это выполнит команду для каждого каталога, каталог которого он использует в качестве аргумента.
Теперь вы можете использовать что-то вроде:
find . -type d -exec sh -c 'ls -R $1 | wc' dummy {} \;
Очевидно, это не работает, но это может немного помочь!