Как удалить много 0-байтовых файлов в Linux? - PullRequest
51 голосов
/ 01 июля 2010

У меня есть каталог с большим количеством 0-байтовых файлов.Я даже не вижу файлы, когда использую команду ls.Я использую небольшой скрипт для удаления этих файлов, но иногда он даже не удаляет эти файлы.Вот сценарий:

i=100
while [ $i -le 999 ];do
    rm -f file${i}*;
    let i++;
done

Есть ли другой способ сделать это быстрее?

Ответы [ 10 ]

115 голосов
/ 01 июля 2010

Использование find в сочетании с xargs.

find . -name 'file*' -size 0 -print0 | xargs -0 rm

Вы избегаете запускать rm для каждого файла.

75 голосов
/ 01 июля 2010

В GNU find (см. Комментарии) нет необходимости использовать xargs:

find -name 'file*' -size 0 -delete
6 голосов
/ 01 июля 2010

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

найти. -maxdepth 1 -size 0c -exec rm {} \;

И если вы также хотите удалить 0-байтовые файлы в подкаталогах, пропустите -maxdepth 1 в предыдущей команде и выполните.

4 голосов
/ 12 января 2018
find . -maxdepth 1 -type f -size 0 -delete

Находит файлы с размером 0 в текущем каталоге, не заходя в подкаталоги, и удаляет их.

Чтобы вывести список файлов без их удаления:

find . -maxdepth 1 -type f -size 0
4 голосов
/ 01 июля 2010

Удалить все файлы с именем file ... в текущем каталоге:

find . -name file* -maxdepth 1 -exec rm {} \;

Это по-прежнему занимает много времени, так как начинается rm для каждого файла.

2 голосов
/ 26 декабря 2018

Если вы хотите найти и удалить все 0-байтовые файлы в папке:

find /path/to/folder -size 0 -delete
2 голосов
/ 01 июля 2010

вы даже можете использовать опцию -delete, которая удалит файл.

из man find, -delete Удалить файлы;истина, если удаление прошло успешно.

1 голос
/ 01 июля 2010

Вот пример, попытка его самостоятельно поможет в этом разобраться:

bash-2.05b$ touch empty1 empty2 empty3
bash-2.05b$ cat > fileWithData1
Data Here
bash-2.05b$ ls -l
total 0
-rw-rw-r--    1 user group           0 Jul  1 12:51 empty1
-rw-rw-r--    1 user group           0 Jul  1 12:51 empty2
-rw-rw-r--    1 user group           0 Jul  1 12:51 empty3
-rw-rw-r--    1 user group          10 Jul  1 12:51 fileWithData1
bash-2.05b$ find . -size 0 -exec rm {} \;
bash-2.05b$ ls -l
total 0
-rw-rw-r--    1 user group          10 Jul  1 12:51 fileWithData1

Если вы посмотрите на справочную страницу для поиска (введите man find), вы увидите массивмощных опций для этой команды.

0 голосов
/ 01 июля 2010

Поднявшись на уровень, стоит выяснить, для чего эти файлы. Вы просто лечите симптомы, удаляя их. Что если какая-то программа использует их для блокировки ресурсов? Если это так, то их удаление может привести к коррупции.

lsof - это один из способов выяснить, какие процессы имеют дескриптор пустых файлов.

0 голосов
/ 01 июля 2010

"... иногда это даже не удаляет эти файлы" заставляет меня думать, что это может быть чем-то, что вы делаете регулярно.Если это так, этот сценарий Perl удалит все обычные нулевые файлы в вашем текущем каталоге.Он полностью избегает использования rm с помощью системного вызова (unlink) и довольно быстр.

#!/usr/bin/env perl
use warnings;
use strict;

my @files = glob "* .*";
for (@files) {
    next unless -e and -f;
    unlink if -z;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...