Как я могу удалить все пустые каталоги в поддереве? Я использовал что-то вроде
find . -type d -exec rmdir {} 2>/dev/null \;
но мне нужно запустить несколько раз, чтобы удалить каталоги, содержащие только пустые каталоги. Более того, он довольно медленный, особенно под Cygwin.
Ответы:
Комбинируя
find
опции и предикаты GNU , эта команда должна выполнить работу:-type d
ограничивает каталоги-empty
ограничивает пустые-delete
удаляет каждый каталогДерево идет от листьев без необходимости указывать,
-depth
как это подразумевается-delete
.источник
-delete
уже подразумевается,-depth
поэтому вам не нужно указывать это вручную.-mindepth 1
сюда, чтобы предотвратить удаление самого исходного каталога, если он будет пустым.!
имеет особое значение для оболочки. Вам нужно избежать этого. Что-то вроде:\! -name 'Completed'
прямо перед этим-delete
должно работать. Или вы просто поместите файл маркера в этот каталог.Перечислите каталоги, глубоко вложенные в первую очередь.
(Обратите внимание, что перенаправление применяется к
find
команде в целом, а не только кrmdir
. Перенаправление только дляrmdir
может привести к значительному замедлению, так как вам потребуется вызвать промежуточную оболочку.)Вы можете избежать работы
rmdir
с непустыми каталогами, передав-empty
предикат для поиска. GNU find проверяет каталог, когда он собирается выполнить команду, поэтому каталоги, которые только что были очищены, будут выбраны.Другой способ ускорить работу - сгруппировать
rmdir
вызовы. Оба, вероятно, будут заметно быстрее, чем оригинал, особенно при Cygwin. Я не ожидаю большой разницы между этими двумя.Какой метод быстрее, зависит от того, сколько у вас непустых каталогов. Вы не можете комбинировать
-empty
с методами для группировки вызовов, потому что тогда каталоги, которые содержат только пустые каталоги, не являются пустыми к тому моменту, когдаfind
они на них смотрят.Другим способом было бы запустить несколько проходов. Быстрее ли это, зависит от многих вещей, в том числе от того, может ли вся иерархия каталогов оставаться в дисковом кэше между
find
запусками.Или используйте zsh. Спецификатор glob
F
соответствует непустым каталогам, поэтому/^F
соответствует пустым каталогам. Каталоги, которые содержат только пустые каталоги, не могут быть сопоставлены так легко.(Это заканчивается, когда
rmdir
получает пустую командную строку.)источник
-p
? Я бы не подумал, что это будет иметь значение.-empty
должно работать с этим (хотя я не уверен точно, сколько оно получит). И очень, очень тривиально, так как вы, вероятно, не хотите удалять.
, используйте-mindepth 1
.-depth
аргумент, который делаетrmdir -p
бесполезным. Я уже изменил свой комментарий. 90-е годы были моей первоначальной попыткой; Здесь нет ничего удивительного.rmdir
командный вызов, по крайней мере, с помощью GNU find, с помощью этой команды:find . -depth -type d -empty -delete
Если вы просто лавировать
-p
на свой контекстуальныйrmdir
, который будет работать за один проход. Он не будет красивым или оптимальным, но он должен получить все. Это говорит rmdir об удалении любых непустых родительских каталогов той, которую вы удаляете.Вы можете немного сэкономить, добавив
-empty
тест для поиска, чтобы он не беспокоился о непустых каталогах.источник
find . -depth -type d -exec rmdir {} +
это самый простой и стандартный ответ на этот вопрос.
К сожалению, все приведенные здесь ответы зависят от конкретных улучшений, которые существуют не во всех системах.
источник
find . -type d -printf "%d %p\n" |\ sort -nr |\ perl -pe 's/^\d+\s//;' |\ while read dir; do \ (rmdir "$dir" > /dev/null 2>&1); \ done
Вот как это работает:
rmdir
по списку один за другимисточник
Я использую эти псевдонимы для часто используемых
find
команд, особенно когда я очищаю дисковое пространство с помощью dupeguru , где удаление дубликатов может привести к большому количеству пустых каталогов.Комментарии внутри,
.bashrc
так что я не забуду их позже, когда мне нужно настроить его.источник
rm -r */
Команда сработала легко для меня.rm
Необходимо-f
принудительно удалить каталоги с файлами.rm -r
следует удалять только пустые каталоги. Я открыт, почему это может быть неправильно. Это также должно оставить файлы, так как*/
смотрит только на папки.источник
rm
он предназначен главным образом для удаления файлов. Хотя*/
только соответствует каталогам, я понятия не имею, что он делает на более глубоких уровнях. Я также могу представить, что он работает только на некоторых системах.