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


16

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

Ответы:


34

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

find . -type f -size 0b -print

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

find . -type f -size 0b -delete

Теперь, есть ли способ переместить файлы из одного места в другое, и конфликты заменить, если размер одинаков, но сохранить обе копии, если размер отличается?
user245115

Это звучит как работа для rsync .

7
Вы можете использовать -emptyвместо -size 0b.
Кевин

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

4

Вы также можете сделать это прямо в оболочке. Это может быть полезно, если вы не хотите удалять пустые скрытые файлы (те, чье имя начинается с a .). Хотя вы можете сделать это и с 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" ]true, если файл существует и не пуст. Следовательно, [ ! -s "$file" ]( !инвертирует тест) верно, если файл не существует или если он пустой.
  • [ -f "$file" ]: true, если файл является обычным файлом. Не каталог, не файл устройства, не символическая ссылка и т. Д.
  • rm "$file" : удалить файл.

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


и я подумал, мой ответ сложный :) +1
AB

2

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

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

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

find . -type f -empty -delete

это удалит все пустые файлы.

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

find . -type f -empty

На Ubuntu 14.04 LTS, без -type f, -emptyтакже удалит пустые каталоги. Только что проверил справочную страницу.
камыш
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.