Ответ 1
Используйте find
в сочетании с xargs
.
find . -name 'file*' -size 0 -print0 | xargs -0 rm
Вы не запускаете rm
для каждого файла.
У меня есть каталог с большим количеством 0 байтовых файлов. Я даже не вижу файлы, когда использую команду ls. Я использую небольшой script для удаления этих файлов, но иногда это даже не удаляет эти файлы. Вот script:
i=100
while [ $i -le 999 ];do
rm -f file${i}*;
let i++;
done
Есть ли другой способ сделать это быстрее?
Используйте find
в сочетании с xargs
.
find . -name 'file*' -size 0 -print0 | xargs -0 rm
Вы не запускаете rm
для каждого файла.
С GNU find
(см. комментарии) нет необходимости использовать xargs:
find -name 'file*' -size 0 -delete
Удалить все файлы с именем file... в текущем каталоге:
find . -name file* -maxdepth 1 -exec rm {} \;
Это займет много времени, так как он запускает rm
для каждого файла.
Вы можете использовать следующую команду:
найти. -maxdepth 1 -size 0c -exec rm {} \;
И если вы хотите удалить файлы с 0 байтами в подкаталогах, опустите -maxdepth 1
в предыдущую команду и выполните.
Вот пример, сам попробовать это поможет:
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
), вы увидите массив мощных параметров для этой команды.
вы даже можете использовать опцию -delete, которая удалит файл.
от человека найти, -Удалить Удалить файлы; true, если удаление удалось.
"... иногда это даже не удаляет эти файлы" заставляет меня думать, что это может быть что-то, что вы делаете регулярно. Если это так, этот 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;
}
Поднимая уровень, стоит разобраться, почему файлы есть. Вы просто лечите симптом, удаляя их. Что делать, если какая-то программа использует их для блокировки ресурсов? Если так, то их удаление может привести к коррупции.
lsof - это один из способов выяснить, какие процессы имеют дескриптор пустых файлов.