Rimuovere i file di 0 byte di dimensioni tramite riga di comando?


16

Quindi, ho una directory piena di altre directory e mi chiedevo se fosse possibile rimuovere file che non avevano dimensioni. In genere questi file sono 0 byte e poiché voglio unire tutti questi sottodiretti, potrei sostituire un file perfettamente legittimo con un file 0 byte senza peso, e lì va il mio file legittimo. Un modo per rimuovere i file zero byte?

Risposte:


34

Utilizzare il comando Trova per trovare i file per dimensione e stampare i nomi dei file sullo standard output.

find . -type f -size 0b -print

sostituire -printcon -deleteper eliminare i file anziché stamparli sullo schermo.

find . -type f -size 0b -delete

Ora, c'è un modo per spostare i file da una posizione a un'altra e con i conflitti sostituire se la dimensione è la stessa ma conservare entrambe le copie se la dimensione è diversa?
user245115

Sembra un lavoro per rsync .

7
Puoi usare -emptyinvece di -size 0b.
Kevin,

6

Trova e rimuovi tutti i file con una dimensione di 0 ricorsivamente:

find . -type f -size 0 -print0 | xargs -I{} -0 rm {}

Esempio:

% ls -og   
total 4
-rw-rw-r-- 1 0 Jun  7 20:31 bar
-rw-rw-r-- 1 5 Jun  7 20:29 foo

% find . -size 0 -print0 | xargs -I{} -0 rm {}

% ls -og                                      
total 4
-rw-rw-r-- 1 5 Jun  7 20:29 foo

4

Puoi anche farlo direttamente nella shell. Ciò potrebbe essere utile se non si desidera eliminare file nascosti vuoti (quelli il cui nome inizia con a .). Anche se potresti farlo anche con find, un'alternativa sarebbe usare la shell stessa:

shopt -s globstar
for file in **/*; do [ ! -s "$file" ] && [ -f "$file" ] && rm "$file"; done

Spiegazione

  • shopt -s globstar: attiva l'opzione globstar per bash che fa **corrispondere una o più sottodirectory. **/*abbinerà tutti i file e le directory nella directory corrente e tutte le sue sottodirectory.
  • for file in **/*; do ...; done : scorre su tutti i file e le directory trovati;
  • [ ! -s "$file" ]: [ -s "$file" ]è vero se il file esiste e non è vuoto. Pertanto, [ ! -s "$file" ]( !inverte il test) è vero se il file non esiste o se è vuoto.
  • [ -f "$file" ]: vero se il file è un file normale. Non una directory o un file dispositivo o un collegamento simbolico ecc.
  • rm "$file" : elimina il file.

Il &&assicurarsi che il comando successivo viene eseguito solo se il precedente ha avuto successo così questo cancellerà solo vuote, file regolari.


e ho pensato, la mia risposta è complicata :) +1
AB

2

Sebbene la maggior parte delle risposte sopra sia corretta, dai un'occhiata a questo comando:

Un file di dimensioni pari a 0 byte indica un file vuoto

sebbene sia possibile eseguire questo comando:

find . -type f -empty -delete

questo eliminerà tutti i file vuoti.

Puoi dare un'occhiata a quei file prima di eliminare:

find . -type f -empty

Su Ubuntu 14.04 LTS, anche senza -type f, -emptyverranno eliminate anche le directory vuote. Ho appena controllato la pagina man.
Bulrush,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.