Вопрос или проблема
Чтобы найти и удалить пустые файлы, я нашёл следующий вопрос на Stack Overflow:
https://stackoverflow.com/q/3157343
Там около 10 ответов, но все они используют -size 0
, а не -empty
.
Например, ответ на +153:
find . -name 'file*' -size 0 -print0 | xargs -0 rm
Другой ответ, +100:
find -name 'file*' -size 0 -delete
Почему так? Другими словами, какие преимущества дает -size 0
по сравнению с -empty
?
Моё личное решение для macOS — это
find . -mindepth 1 -maxdepth 1 -type f -empty -print -delete
Оператор -size
задан стандартом POSIX, так что любая его реализация поддерживает это. -empty
не задан, и поэтому доступен не повсюду. Поэтому безопаснее использовать -size 0
, чтобы проверить, что файл пустой, если вы не знаете, с какой версией find
он будет использоваться.
Ответ или решение
Для нахождения и удаления пустых файлов существует несколько подходов в использовании команды find
, и два из наиболее популярных вариантов — это использование операторов -size 0
и -empty
. В данном ответе мы рассмотрим различия между ними, их преимущества и недостатки, и дадим рекомендации по выбору наиболее подходящего для вашей задачи метода.
Операторы -size 0
и -empty
-
-size 0
- Оператор
-size 0
используется для поиска файлов размером ровно 0 байт. Он является частью спецификации POSIX, что гарантирует его поддержку в большинстве систем, которые используют стандартный инструментарий Unix, включая Linux и macOS. - Оператор проверяет фактический размер файла. Это означает, что если файл не содержит никаких данных, он будет выбран по условию
-size 0
. - Преимущества:
- Универсальность: поддерживается на большинстве систем и дистрибутивов.
- Ясность: явное указание на размер файла.
- Недостатки:
- Не учитывает пустые директории.
- Оператор
-
-empty
- Оператор
-empty
используется для поиска пустых файлов и пустых директорий. Он не входит в базовую спецификацию POSIX, и его поддержка может варьироваться в зависимости от реализации командыfind
. - Преимущества:
- Позволяет находить как пустые файлы, так и пустые директории с одной командой.
- Недостатки:
- Ограниченная поддержка: может отсутствовать в некоторых версиях
find
, поэтому использование этого оператора не всегда является безопасным.
- Ограниченная поддержка: может отсутствовать в некоторых версиях
- Оператор
Рекомендации по выбору метода
Ваш выбор между -size 0
и -empty
зависит от нескольких факторов:
-
Совместимость: Если вы работаете в среде, где необходимо обеспечить максимальную совместимость с различными Unix-подобными системами, лучше использовать
-size 0
. Это гарантирует, что ваш скрипт будет работать на любых системах, где доступенfind
. -
Требования к содержимому: Если вам нужно находить только пустые файлы и игнорировать директории, то оператор
-size 0
будет более подходящим. Если вы хотите получать пустые директории при анализе, используйте-empty
, но убедитесь, что ваша среда поддерживает этот оператор.
Заключение
Таким образом, предоставленные вами команды, такие как find . -name 'file*' -size 0 -delete
и find . -mindepth 1 -maxdepth 1 -type f -empty -print -delete
решают одну задачу, но с разными подходами. Если вы хотите гарантировать совместимость и ясность, выбирайте -size 0
. Если же вам нужна функциональность и возможность находить как файлы, так и директории, и если вы уверены в поддержке -empty
в вашем окружении, можете применять этот оператор.
Понимание этих различий поможет вам эффективно находить и удалять пустые файлы в зависимости от конкретных условий работы.