Linux удалить файл размером 0

Как мне удалить определенный файл в Linux, если его размер равен 0. Я хочу выполнить это в crontab без дополнительного скрипта.

l filename.file | grep 5th-tab | not eq 0 | rm

Что-то вроде этого?


person Franz Kafka    schedule 29.03.2011    source источник
comment
Это не дубликат, я хотел сделать это только с одним файлом, который я знаю по имени, ! -s - это то, что мне было нужно, и в этом вопросе об этом не упоминается.   -  person Boris    schedule 07.01.2021


Ответы (8)


Это удалит все файлы в каталоге (и ниже), которые имеют нулевой размер.

find /tmp -size  0 -print -delete

Если вам просто нужен определенный файл;

if [ ! -s /tmp/foo ] ; then
  rm /tmp/foo
fi
person Paul Tomblin    schedule 29.03.2011
comment
ярлык: [ -s /tmp/foo ] || rm /tmp/foo (проверьте, если размер равен нулю, иначе удалите). Также обратите внимание, что xargs небезопасно, если имена файлов/каталогов содержат пробелы; find ... -exec rm '{}' \; в такой ситуации безопасен. - person FrankH.; 13.05.2011
comment
@ Фрэнк, ты ошибаешься насчет xargs. '-print0` и xargs -0 исправляют пробелы. - person Paul Tomblin; 13.05.2011
comment
@FrankH: Кроме того, даже если вы используете find -exec, всегда отдавайте предпочтение + ; в тех случаях, когда вы можете (и это один из таких случаев). - person Chris Jester-Young; 11.06.2011
comment
Будет ли rm -- (обратите внимание на конечные символы --) быть здесь безопаснее, чем просто rm для предотвращения мошеннических имен файлов? serverfault.com/questions/337082 / - person OnlineCop; 27.10.2015
comment
Есть ли также команда для пробного запуска, чтобы увидеть, какие файлы будут удалены? - person Simon Baars; 21.04.2018
comment
@SimonBaars find /tmp -size 0 -print0 |xargs -0 echo rm - person Paul Tomblin; 22.04.2018
comment
Почему бы не просто -delete? - person Ruslan; 04.04.2019
comment
@Руслан, потому что -delete новый, а моя версия работает со всеми версиями find, выпущенными за последние 40 лет. - person Paul Tomblin; 04.04.2019
comment
Действительно ли -print0 40 лет и он вездесущ? - person Ruslan; 04.04.2019
comment
@Rusian почти уверен, что это было в BSD 4.3, хотя, по-видимому, он не попал в строгие SysV Unices, такие как ранний AIX. - person Paul Tomblin; 04.04.2019

вы можете использовать find:

 find . -size 0 -delete
person James.Xu    schedule 29.03.2011
comment
Я бы добавил -type f, так как также каталог помечен как нулевой. Точка необязательна. - person Antonio; 02.08.2013
comment
Точка необязательна для Linux, но не обязательна для Mac OS. - person Jakub M.; 31.01.2014
comment
@JakubM. Спасибо, я отредактировал свой ответ соответственно. - person Antonio; 11.02.2014
comment
Есть вариант -empty :-) - person lilydjwg; 20.03.2016
comment
@lilydjwg Точно, если нам разрешено использовать флаги, отличные от POSIX, find . -empty -delete будет самым крутым. :-) - person Anne van Rossum; 19.10.2016
comment
Вы можете добавить -maxdepth 1 для текущей папки. - person aloisdg; 02.02.2017

Для этого вы можете использовать команду find. Мы можем сопоставлять файлы с помощью -type f и сопоставлять пустые файлы с помощью -size 0. Затем мы можем удалить совпадения с -delete.

find . -type f -size 0 -delete
person PYK    schedule 28.02.2016
comment
найти . -maxdepth 1 -type f -size 0 -delete Это находит пустые файлы в текущем каталоге, не переходя в подкаталоги. - person user7194913; 12.01.2018

В Linux команда stat(1) полезна, когда вам не нужен find(1):

(( $(stat -c %s "$filename") )) || rm "$filename"

Команда stat здесь позволяет нам просто получить размер файла, это -c %s (см. справочные страницы для других форматов). Я запускаю программу статистики и фиксирую ее вывод, это $( ). Этот вывод виден в числовом виде, это внешний (( )). Если для размера задан ноль, это ЛОЖЬ, поэтому выполняется вторая часть операции ИЛИ. Ненулевое значение (непустой файл) будет TRUE, поэтому rm не будет выполняться.

person cdarke    schedule 13.05.2011

Это работает для простой BSD, поэтому она должна быть универсально совместима со всеми разновидностями. Ниже, например, в pwd ( . )

find . -size 0 |  xargs rm
person user1874594    schedule 18.02.2016
comment
Разве BSD не поддерживает опцию -delete? freebsd.org/cgi/man.cgi?find(1) - person Antonio; 17.03.2017
comment
@Antonio OpenBSD 6.0, по крайней мере, нет. - person Colin 't Hart; 04.02.2019

Для нерекурсивного удаления (с использованием du и awk):

rm `du * | awk '$1 == "0" {print $2}'`
person Harrison    schedule 02.09.2014
comment
-bash: /usr/bin/du: слишком длинный список аргументов - person Antonio; 11.07.2017

person    schedule
comment
Очень элегантное решение! - person Nick; 08.10.2014
comment
Я бы добавил -name '*.SomeFileExtension', например: если вы хотите удалить только текстовые файлы, я бы использовал: find . -name '*.txt' -type f -empty -delete - person jspek; 18.04.2019
comment
@jspek, ну, это зависит от того, есть ли у вас конкретное применение ... Обычно, когда вы ищете пустые файлы, вы готовы убить их всех. :) - person Antonio; 18.04.2019
comment
Пришлось выпить кофе после запуска этой команды в каталоге с 2,2 миллионами файлов. :P Работал как шарм, когда я вернулся, осталось 350.000. Спасибо! - person ArendE; 26.02.2020

person    schedule
comment
вы можете просто использовать флаг -delete - сохраняет файл exec. - person Yehosef; 07.07.2015