Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

find -name 'file*' -size 0 -delete

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

Вот пример, сам попробовать это поможет:

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

Ответ 6

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

от человека найти,  -Удалить             Удалить файлы; true, если удаление удалось.

Ответ 7

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

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

my @files = glob "* .*";
for (@files) {
    next unless -e and -f;
    unlink if -z;
}

Ответ 8

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

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