У меня есть каталог со многими, нумеруют 0-байтовых файлов в нем. Я не могу даже видеть файлы, когда я использую команду ls. Я использую маленький сценарий для удаления этих файлов, но иногда который даже не удаляет эти файлы. Вот сценарий:
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
для каждого файла.
Вот пример, попробуйте сами, это поможет понять смысл:
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
) , вы увидите множество мощных опций для этой команды.
Поднимаясь на уровень выше, стоит разобраться, для чего нужны файлы. Вы просто лечите симптомы, удаляя их. Что, если какая-то программа использует их для блокировки ресурсов? В таком случае их удаление может привести к повреждению.
lsof - это один из способов выяснить, какие процессы обрабатывают пустые файлы.
Вы можете использовать следующую команду:
find . -maxdepth 1 -size 0c -exec rm {} \;
А если вы хотите удалить файлы размером 0 байт и в подкаталогах, опустите -maxdepth 1
в предыдущей команде и выполните.
Удалить все файлы с именем file ... в текущем каталоге:
find . -name file* -maxdepth 1 -exec rm {} \;
Это все равно займет много времени, так как запускается rm
для каждого файла.
вы даже можете использовать опцию -delete, которая удалит файл.
из man find, -delete Удалить файлы; true, если удаление прошло успешно.
С find
GNU (см. комментарии) нет необходимости использовать xargs :
find -name 'file*' -size 0 -delete
"... иногда это даже не удаляет эти файлы» заставляет меня думать, что это может быть то, что вы делаете регулярно. Если это так, этот сценарий Perl удалит все обычные файлы с нулевым байтом в текущем каталоге. Он полностью избегает rm, используя системный вызов (unlink), и довольно быстро.
#!/usr/bin/env perl
use warnings;
use strict;
my @files = glob "* .*";
for (@files) {
next unless -e and -f;
unlink if -z;
}