2010-07-01 10 views
38

Mam katalog zawierający wiele plików 0 bajtów. Nie mogę nawet zobaczyć plików, gdy używam polecenia ls. Używam małego skryptu do usuwania tych plików, ale czasami nawet nie usuwa tych plików. Oto skrypt:Jak usunąć wiele plików 0-bajtowych w systemie Linux?

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

Czy istnieje jakikolwiek inny sposób, aby zrobić to szybciej?

+1

Jeśli pliki są 0 bajtów i „ls” ich nie pokazać, jak wiesz, są one tam? – JRT

+0

Wiem, ponieważ byłem w stanie zobaczyć je kilka razy, te pliki o wielkości 0 bajtów pojawiły się kilka razy i nie wiem kiedy i jak, ale czasami mogłem je zobaczyć czasami, ponieważ teraz nie mogłem ich zobaczyć. Jednak znam przyczynę problemu i wystąpił ponownie, dlatego wiem, że są w tym katalogu –

+0

inne niż 'while [$ i -le 999]' i 'let i ++', możesz również użyć 'seq' z' for w $ (seq ...) ' – YuppieNetworking

Odpowiedz

91

Użyj find w połączeniu z xargs.

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

Unikasz uruchamiania rm dla każdego pliku.

+10

+1 dla 'xargs'. Znacznie lepiej niż "-exec". Rozważ użycie '-print0' i' -0' dla bezpieczeństwa. –

+1

Dzięki, Martin. Dodałem '-print0',' -0'. –

+0

Dzięki, oddaję strzał dla tego. Będę zamieszczał wyniki. –

4

Usuń wszystkie pliki o nazwie plik ... w aktualnym katalogu:

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

ten będzie nadal trwać długo, jak zaczyna rm dla każdego pliku.

+1

Domyślam się, że powinieneś używać podwójnych cudzysłowów: -name" file * " W przeciwnym razie wzór zostanie rozszerzony przez powłokę. – Philipp

+2

Nie ogranicza to 'rm' do plików o 0 bajtach. Jednak, aby być uczciwym, nie ma również kodu OP. –

+1

Możesz użyć '+' zamiast ';' aby mieć 'find' wywołanie' rm' z wieloma argumentami zamiast wywoływania procesu dla każdego pliku. – Philipp

1

Oto przykład, próbując go sobie pomoże to sensu:

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 

Jeśli spojrzeć na stronie man find (typu man find), widać szereg zaawansowanych opcji dla tego polecenia.

3

Można użyć następującego polecenia:

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

Jeśli szukasz również usunięcia plików 0-bajtowych w podkatalogach, pomiń -maxdepth 1 w poprzednim poleceniu i wykonaj.

57

Z GNU na find (patrz komentarze), nie ma potrzeby korzystania z xargs:

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

Nice - Nie zdawałem sobie sprawy, że znalazłem akcję usuwania. – GreenMatt

+3

Tylko w GNU find. POSIX nie określa akcji takich jak -delete i -ls –

+4

. Zauważ, że oczywiście nie potrzebujesz pliku '-name 'file' '' 'jeśli nie filtrujesz według nazwy. –

0

„... czasami to nawet nie usuwać tych plików” sprawia, że ​​myślę, że to może być coś robić regularnie. Jeśli tak, ten skrypt Perla usunie wszystkie zwykłe pliki zerowe w bieżącym katalogu. Całkowicie unika rm przy użyciu wywołania systemowego (odłączenie) i jest dość szybki.

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

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

To nie działa niestety –

+0

Hm, to działa dla mnie. Musi mieć coś wspólnego z innym problemem związanym z Javą/selenem. Albo to, albo pliki, które próbujesz usunąć, nie są zwykłymi plikami. Nie sądzę, że kod jest wadliwy. – andereld

0

Przejdź na wyższy poziom, warto się zastanowić, dlaczego pliki są dostępne. Po prostu leczycie symptom, usuwając je. Co jeśli jakiś program używa ich do blokowania zasobów? Jeśli tak, usunięcie ich może prowadzić do korupcji.

lsof to jeden ze sposobów, aby dowiedzieć się, które procesy mają uchwyt na puste pliki.

+0

Powodem jest to, dlaczego one tam są: http://stackoverflow.com/questions/3157144/tomcat-creates-0-byte-files Próbuję również rozwiązać ten problem –

2

można nawet użyć opcji -delete, która usunie plik.

z mężczyzny znajdź, -nie usuń Usuń pliki; true, jeśli usunięcie zakończyło się pomyślnie.

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

Znajduje pliki o rozmiarze 0 w bieżącym katalogu, bez przechodzenia do podkatalogów i usuwa je.

Do listy plików bez ich usuwania:

find . -maxdepth 1 -type f -size 0 
Powiązane problemy