Удалить файлы размером 0 байт по командной строке?

15

Итак, у меня есть каталог, заполненный другими каталогами, и мне было интересно, можно ли удалить файлы, которые не имеют размера. Обычно эти файлы равны 0 байтам, и поскольку я хочу объединить все эти поддиры, я мог бы заменить совершенно законный файл невесомым 0-байтным файлом, и там идет мой законный файл. Любой способ удалить файлы с нулевым байтом?

    
задан user245115 07.06.2015 в 18:25
источник

4 ответа

31

Используйте команду Найти , чтобы найти файлы по размеру и печатать имена файлов для стандартного вывода.

find . -type f -size 0b -print

замените -print на -delete , чтобы удалить файлы, а не распечатывать их на экране.

find . -type f -size 0b -delete
    
ответ дан user257256 07.06.2015 в 18:33
источник
6

Найти и удалить все файлы с рекурсивно 0:

find . -type f -size 0 -print0 | xargs -I{} -0 rm {}

Пример:

% ls -og   
total 4
-rw-rw-r-- 1 0 Jun  7 20:31 bar
-rw-rw-r-- 1 5 Jun  7 20:29 foo

% find . -size 0 -print0 | xargs -I{} -0 rm {}

% ls -og                                      
total 4
-rw-rw-r-- 1 5 Jun  7 20:29 foo
    
ответ дан A.B. 07.06.2015 в 18:31
4

Вы также можете сделать это прямо в оболочке. Это может быть полезно, если вы не хотите удалять пустые скрытые файлы (те, чье имя начинается с . ). Хотя вы можете сделать это и с find , альтернативой будет использование самой оболочки:

shopt -s globstar
for file in **/*; do [ ! -s "$file" ] && [ -f "$file" ] && rm "$file"; done

Объяснение

  • shopt -s globstar : включает параметр globstar для bash, который делает ** совпадающим с одним или несколькими подкаталогами. **/* будет соответствовать всем файлам и каталогам в текущем каталоге и во всех его подкаталогах.
  • for file in **/*; do ...; done : перебрать все найденные файлы и каталоги;
  • [ ! -s "$file" ] : [ -s "$file" ] истинно, если файл существует и не пуст. Следовательно, [ ! -s "$file" ] ( ! обращается к тесту) истинно, если файл не существует или пуст.
  • [ -f "$file" ] : true, если файл является обычным файлом. Не каталог или файл устройства или символическая ссылка и т. Д.
  • rm "$file" : удалить файл.

&& гарантирует, что следующая команда будет запущена только в том случае, если предыдущий был успешным, поэтому он будет удалять только пустые обычные файлы.     

ответ дан terdon 07.06.2015 в 19:01
2

Хотя большинство ответов выше верно, посмотрите эту команду:

  

Размер файла размером 0 байт означает пустой файл

, хотя вы можете запустить эту команду:

find . -type f -empty -delete

это приведет к удалению всех пустых файлов.

Вы можете просмотреть эти файлы перед удалением:

find . -type f -empty
    
ответ дан Maythux 15.06.2015 в 14:50