2010-07-01 25 views
38

Ho una directory con un numero elevato di file da 0 byte. Non riesco nemmeno a vedere i file quando uso il comando ls. Sto usando un piccolo script per cancellare questi file, ma a volte questo non elimina nemmeno questi file. Ecco la sceneggiatura:Come cancellare molti file da 0 byte in linux?

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

C'è qualche altro modo per farlo più rapidamente?

+1

Se i file sono 0 byte e 'ls' non li mostrare, come si fa a non sapere che sono? – JRT

+0

Lo so perché sono stato in grado di vederli alcune volte, questi file di 0 byte si sono verificati più volte e non so quando e come, ma a volte potevo vederli a volte perché ora non potevo vederli. Comunque conosco la ragione del problema e si è verificato di nuovo, quindi so che sono in quella directory –

+0

oltre a "while [$ i -le 999]' e "lascia i ++", puoi anche usare 'seq' con' per i in $ (seq ...) ' – YuppieNetworking

risposta

91

Utilizzare find combinato con xargs.

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

Si evita di avviare rm per ogni file.

+10

+1 per 'xargs'. Molto meglio di '-exec'. Considera l'uso di '-print0' e' -0' per sicurezza. –

+1

Grazie, Martin. Ho aggiunto il '-print0',' -0'. –

+0

Grazie, sto dando uno scatto per questo. Posterò il risultato –

4

eliminare tutti i file di nome di file ... nella directory corrente:

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

Questo vorrà ancora molto tempo, in quanto inizia rm per ogni file.

+1

Immagino che dovresti usare le doppie virgolette: -name" file * " Altrimenti il ​​modello sarà espanso dalla shell. – Philipp

+2

Ciò non limita il 'rm' ai file con 0 byte. Ad essere onesti, però, non è nemmeno il codice che l'OP ha pubblicato. –

+1

Puoi usare '+' invece di ';' per avere 'find' chiama' rm' con più argomenti invece di invocare un processo per ogni file. – Philipp

1

Ecco un esempio, provarlo voi stessi vi aiuterà questo a dare un senso:

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 

Se si dispone di uno sguardo alla pagina man di find (tipo man find), si vedrà una serie di potenti opzioni per questo comando.

3

È possibile utilizzare il seguente comando:

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

E se stanno cercando di eliminare i file 0 byte nella sottodirectory così, omettere -maxdepth 1 nel precedente comando ed eseguire.

57

con GNU di find (vedi commenti), non v'è alcuna necessità di utilizzare xargs:

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

Nice - Non mi ero reso conto che il find avesse un'azione di cancellazione. – GreenMatt

+3

Solo in GNU find. POSIX non specifica azioni come -delete e -ls –

+4

Si noti che ovviamente non è necessario il file '-name '*'' part se non si filtra per nome. –

0

"... a volte che non ha nemmeno eliminare questi file" mi fa pensare che questo potrebbe essere qualcosa che si fare regolarmente. Se è così, questo script Perl rimuoverà tutti i file regolari a zero byte nella tua directory corrente. Evita completamente rm utilizzando una chiamata di sistema (scollegamento) ed è piuttosto veloce.

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

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

Questo non funziona purtroppo –

+0

Hm, funziona per me. Deve avere qualcosa a che fare con il tuo altro problema (relativo a Java/Selenium). O quello, o i file che stai cercando di rimuovere non sono file regolari. Non penso che il codice sia difettoso. – andereld

0

Per passare a un livello vale la pena capire perché i file ci sono. Stai solo trattando un sintomo cancellandoli. Cosa succede se qualche programma li sta usando per bloccare le risorse? Se è così, la tua eliminazione potrebbe portare alla corruzione.

lsof è un modo per capire quali processi hanno un handle sui file vuoti.

+0

Il motivo è il motivo per cui sono qui: http://stackoverflow.com/questions/3157144/tomcat-creates-0-byte-files Sto anche cercando di risolvere il problema –

2

puoi persino usare l'opzione -delete che cancellerà il file.

da man find, -delete Elimina file; vero se la rimozione è riuscita.

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

Trova i file con dimensione 0 nella directory corrente, senza entrare nelle sottodirectory e li elimina.

per elencare i file senza rimuoverli:

find . -maxdepth 1 -type f -size 0