Как рекурсивно удалить все пустые файлы и каталоги в Linux?

Как рекурсивно удалить все пустые файлы и каталоги в Linux?

Как рекурсивно очистить все пустые файлы и каталоги в родительском каталоге?

Допустим, у меня есть такая структура каталогов:

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$"

решение3

Вы также можете сделать это с помощью fdинструмента:

fd -t e -x rm -r

https://github.com/sharkdp/fd

Связанный контент