Как удалить много 0-байтовых файлов в Linux?

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

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

Там какой-либо другой путь состоит в том, чтобы сделать это более быстро?

55
задан Brian Tompsett - 汤莱恩 8 July 2015 в 21:26
поделиться

8 ответов

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

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

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

118
ответ дан 26 November 2019 в 17:36
поделиться

Вот пример, попробуйте сами, это поможет понять смысл:

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 ) , вы увидите множество мощных опций для этой команды.

1
ответ дан 26 November 2019 в 17:36
поделиться

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

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

0
ответ дан 26 November 2019 в 17:36
поделиться

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

find . -maxdepth 1 -size 0c -exec rm {} \;

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

6
ответ дан 26 November 2019 в 17:36
поделиться

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

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

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

4
ответ дан 26 November 2019 в 17:36
поделиться

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

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

2
ответ дан 26 November 2019 в 17:36
поделиться

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

find -name 'file*' -size 0 -delete
77
ответ дан 26 November 2019 в 17:36
поделиться

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

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

my @files = glob "* .*";
for (@files) {
    next unless -e and -f;
    unlink if -z;
}
0
ответ дан 26 November 2019 в 17:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: