AIX: найти непустые каталоги

2931
Brian Henk

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

find . -type d ! -empty 

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

3

2 ответа на вопрос

4
Peter Cordes

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

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
Dan McGrath

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

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

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

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

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

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

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

Это должно быть sh -c '...' dummy {} \; Первый аргумент sh -c становится $ 0. Это бит меня первый раз, когда я пытался найти -exec sh ... Peter Cordes 14 лет назад 0
Спасибо, Питер, я не часто играю с нашей системой AIX вне базового использования. :) Dan McGrath 14 лет назад 0