Как рекурсивно очистить все пустые файлы и каталоги в родительском каталоге?
Допустим, у меня есть такая структура каталогов:
Parent/
|____Child1/
|______ file11.txt (empty)
|______ Dir1/ (empty)
|____Child2/
|_______ file21.txt
|_______ file22.txt (empty)
|____ file1.txt
Я должен закончить так:
Parent/
|____Child2/
|_______ file21.txt
|____ file1.txt
решение1
Это действительно простая однострочная фраза:
find Parent -empty -delete
Это довольно понятно. Хотя, когда я проверил, я был удивлен, что он успешно удаляет Parent/Child1. Обычно вы ожидаете, что он обработает родителя перед потомком, если только вы не укажете -depth
.
Это работает, потому что -delete
подразумевает -depth
. СмотритеGNU find руководство:
-delete
Удалить файлы; true, если удаление прошло успешно. Если удаление не удалось, выдается сообщение об ошибке. Если -delete не удается, статус выхода find будет ненулевым (когда он в конечном итоге завершится). Использование -delete автоматически включает опцию -depth.
Обратите внимание, что эти функции не являются частьюСтандарт Posix, но скорее всего будет там во многих дистрибутивах Linux. У вас могут быть определенные проблемы с более мелкими, такими как Alpine Linux, поскольку они основаны наБизибокскоторый не поддерживает -empty
.
Другие системы, которые включают нестандартные -empty
и -delete
включаютБСДиOSXно, по-видимому, нетЭКС.
решение2
Вот решение из двух команд
Удалить пустые файлы
find Parent/ -type f -size 0 -delete
Попробуйте удалитьвсекаталоги
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>/dev/null
Примечание: rmdir
не может удалить непустые каталоги, поэтому его можно безопасно запускать, но он выдаст ошибки, которые мы скрываем.
Как и выше, но немного конкретнее об игнорировании сообщений об ошибках. Возможно, придется внести поправки, если сообщение различается в разных дистрибутивах.
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>&1 \
| grep -iv "Directory not empty$"