2010-07-01 1 views
38

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

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

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

+1

Если файлы 0 байт и «LS» не показывает их, как вы знаете, они там? – JRT

+0

Я знаю, потому что я мог видеть их несколько раз, это 0 байт файлов происходило несколько раз, и я не знаю, когда и как, но иногда я мог видеть их иногда, как сейчас, я не мог их видеть. Однако я знаю причину проблемы, и это произошло снова, поэтому я знаю, что они находятся в этом каталоге –

+0

, кроме 'while [$ i -le 999]' и 'let i ++', вы также можете использовать 'seq' с' for i в $ (seq ...) ' – YuppieNetworking

ответ

91

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

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

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

+10

+1 для 'xargs'. Гораздо лучше, чем '-exec'. По соображениям безопасности используйте '-print0' и' -0'. –

+1

Спасибо, Мартин. Я добавил '-print0',' -0'. –

+0

Спасибо, я делаю снимок для этого. Я опубликую результат. –

4

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

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

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

+1

Я думаю, вы должны использовать двойные кавычки: -name« file * » В противном случае шаблон будет расширен оболочкой. – Philipp

+2

Это не ограничивает файлы 'rm' файлами с 0 байтами. Справедливости ради, однако, и код, опубликованный OP, не был. –

+1

Вы можете использовать '+' вместо ';', чтобы иметь 'find' call' rm' с несколькими аргументами вместо вызова процесса для каждого файла. – Philipp

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

3

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

находку. -maxdepth 1 -size 0c -exec rm {} \;

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

57

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

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

Ницца - я не понимал, что находка имеет действие удаления. – GreenMatt

+3

Только в GNU find. POSIX не указывает такие действия, как -delete и -ls –

+4

Обратите внимание, что вам явно не нужен файл '-name '*' ', если вы не фильтруете по имени. –

0

«... иногда это даже не удалить эти файлы» заставляет меня думать, что это может вам что-то делать регулярно. Если это так, этот скрипт 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

Это не работает, к сожалению –

+0

Хм, он работает для меня. Это должно иметь какое-то отношение к вашей другой (связанной с Java/Selenium) проблеме. Либо это, либо файлы, которые вы пытаетесь удалить, не являются обычными файлами. Я не думаю, что код неисправен. – andereld

0

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

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

+0

Причина в том, что они есть здесь: http://stackoverflow.com/questions/3157144/tomcat-creates-0-byte-files Я также пытаюсь решить эту проблему –

2

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

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

1
find . -maxdepth 1 -type f -size 0 -delete 

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

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

find . -maxdepth 1 -type f -size 0 
Смежные вопросы