3

Во многих системах Unix вы можете сделать что-то вроде

find . -type d ! -empty

В системе AIX -empty, похоже, не распознается. Любые идеи о том, как я мог бы сделать то же самое?

2 ответа2

4

У Дана МакГа правильная идея. Это работает:

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 для каждого каталога.

3

Во-первых, пусто не указано для поиска в стандарте POSIX, поэтому не все версии поддерживают его.

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

find . -type d -exec command '{}' \;

Это выполнит команду для каждого каталога, каталог которого он использует в качестве аргумента.

Теперь вы можете использовать что-то вроде:

find . -type d -exec sh -c 'ls -R $1 | wc' dummy {} \;

Очевидно, это не работает, но это может немного помочь!

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