У меня куча вложенных папок. Большинство папок содержат файлы. Некоторые содержат сотни тысяч файлов. Некоторые пусты.
Я хочу получить список всех пустых папок. Однако когда я бегу:
find -type d -empty
это требует очень долго бегать, намного дольше, чем бегать просто find -type d
. Я подозреваю что -empty
проверяет все файлы, чтобы убедиться, что они пусты, затем -type d
пропускает файлы.
Так что есть:
1) способ оптимизации поиска, чтобы он а) находил все папки, затем б) перечислял пустые?
или
2) другую команду (или команды), которую я мог бы использовать для получения этого списка?
Попробуй это
find / -xdev -type d -exec find {} -maxdepth 0 -empty \;
или немного быстрее
find / -xdev -type d | xargs -I{} find {} -maxdepth 0 -empty
find -type d | xargs -I{} find {} -empty
Только что протестировали, и я не могу получить ваш результат:
japhy@lizard:~ % time find . -type d |wc -l
48403
find . -type d 0.87s user 8.69s system 4% cpu 3:37.60 total
japhy@lizard:~ % time find . -type d -empty |wc -l
3986
find . -type d -empty 0.79s user 4.41s system 57% cpu 9.071 total
japhy@lizard:~ % time find . -empty -type d |wc -l
3986
find . -empty -type d 0.70s user 3.32s system 98% cpu 4.085 total
japhy@lizard:~ % find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX FTS() CBO(level=0)
Какая у вас версия утилиты `find '? Версия распространения?
Эти аргументы для поиска не являются переключателями, которые нужно интерпретировать в том порядке, в котором кажется, что find - find - это процессор командной строки, и каждая из этих вещей - это тест, который нужно запускать последовательно. Ваша командная строка выполняет действия в том порядке, который вы указали: она находит каталоги, а затем проверяет их пустоту. Я не думаю, что есть какие-то уловки с использованием find, чтобы сделать это быстрее.