Come posso eliminare velocemente una cartella con molte sottocartelle?


15

Ho una cartella con 266778 sottocartelle. Come posso cancellarlo?

Ho provato

cd ~/.local/share/Trash/
sudo rm -rf *

ma ci vuole molto tempo. Dopo 1 minuto e 25 secondi in tempo reale e 0,072 secondi di tempo utente ha cancellato solo 2500 cartelle. In questo modo, saranno necessarie più di due ore per eliminare questa cartella.

Esiste un modo più veloce per eliminare questa cartella? Perché c'è una differenza così grande tra il tempo dell'utente e il tempo reale?

real    1m25.474s
user    0m0.072s
sys     0m28.142s

Uso Linux 2.6.32 (Ubuntu 10.04.4 LTS).


Ho appena cercato su Google questo problema e sembra che alcune persone abbiano scoperto che rsync può essere usato in modo abbastanza efficiente come strumento per l'eliminazione di molti file. Resta da valutare se è veramente più veloce.
Johan

2
Per quello che vale: le prestazioni durante l'eliminazione di molte cartelle / file dipendono fortemente dal filesystem. Nella mia esperienza, la differenza quando si eliminano milioni di piccoli file su ext3 (lento) rispetto a XFS (veloce) può essere ore.
pdo,

Se hai spesso questo caso e puoi pianificare in anticipo, usando un filesystem come btrfs e usando un sottovolume, puoi velocizzare le cose semplicemente scaricando quel sottovolume.
PlasmaHH,

Qui è dove puoi trovare la risposta. Quello perl è il più veloce. unix.stackexchange.com/questions/37329/…
SDsolar

Risposte:


17

Se la tua versione di "trova" implementa il comando secondario -delete, allora puoi provare

find directory -delete

In questo caso:

find ~/.local/share/Trash/ -delete

Alcuni comandi, come rm, eseguono la maggior parte del loro lavoro nel kernel. Nelle routine del file system, per essere esatti. Il tempo impiegato per eseguire le chiamate di sistema viene considerato in questo modo, quindi mentre il comando "rm" viene eseguito per un lungo periodo di tempo, non fa molto lavoro nella terra dell'utente: le chiamate di sistema eseguono la maggior parte del lavoro.


+1; anche se questo cancella anche la directory principale e sospetto che l'OP volesse solo eliminare il contenuto della cartella Cestino e non la cartella stessa
don_crissti

1
@don_crissti: buona osservazione. se l'OP voleva eliminare solo i sottodiretti in ~ / .local / share / Trash (e non i file al 1 ° livello), allora: find ~/.local/share/Trash/*/ -delete (ovviamente, questo eliminerà anche i file (e le directory) in uno di quei Cestino / * / subdirs pure)
Olivier Dulac

2
+1 per spiegare il comportamento strano ditime
Martin Thoma

3
È find directory -deletedavvero più veloce di rm -rf directory? Dopotutto, svolgono lo stesso lavoro e non ci sono due modi per farlo.
Gilles 'SO- smetti di essere malvagio' il

1
@Johan find è davvero veloce. Hai mai avuto la possibilità di scoprire il motivo?
Harshdeep,

20

Dipende dalla tua definizione di veloce . Le risposte già qui forniscono una buona soluzione per rimuovere effettivamente le directory dal filesystem, ma se ciò di cui hai veramente bisogno è liberare il nome della directory il più velocemente possibile, una rinominazione sullo stesso filesystem è istantanea:

{ mv directory directory.gone && rm -rf directory.gone; } &

Tecnicamente questo è un imbroglio poiché non ho accelerato l'effettiva eliminazione, ma praticamente è molto utile: uso sempre questo trucco in modo da non dover aspettare operazioni di cancellazione lente.


Grande. Qual è il tuo caso d'uso per farlo tutto il tempo? Se lo fai molto, non c'è pericolo che arretrerai, otterrai più 'directory.gone's e fallirai? Presumo che tu usi un suffisso come '$$' o '% (data ...)'
smci,

1
Se ne avessi bisogno, probabilmente potrei usare mktemp con argomenti che assicurano che rimanga sullo stesso filesystem. Ma non posso dire di avere un esempio specifico in questo momento.
Kojiro,

kojiro, grazie, mktempè quello che stavo cercando di ricordare ...
smci,

1

rm -rf directoryo rm -rf *ovviamente è il metodo più veloce a meno che l' rmimplementazione locale non sia interrotta.

L'uso findnon offre alcun vantaggio.

Se questo è veloce o lento dipende principalmente dal filesystem e dall'implementazione del sistema operativo. Quindi la domanda sembra inappropriata.

UFS e ZFS su Solaris sono noti per essere molto veloci con questo tipo di attività poiché entrambe le implementazioni del filesystem includono un codice di cancellazione in background ritardato che fa sì che le chiamate unlink()e rmdir()ritornino velocemente anche quando l'oggetto correlato impiegherà più tempo in totale.

Con l'eliminazione ritardata dello sfondo nel kernel, anche gli aggiornamenti della directory possono essere eseguiti velocemente e questo aiuta ad accelerare l'intera operazione.


Mentre uno può essere perdonato per aver pensato che, in realtà questo non è vero, come descrive questa risposta .
Hitechcomputergeek il

0

Questa è solo una risposta parziale, che fa luce sui tre valori restituiti dal comando; citato dalla time(1)manpage :

(i) il tempo reale trascorso tra invocazione e terminazione, (ii) il tempo CPU dell'utente (la somma dei valori tms_utimee tms_cutimein a struct tmscome restituito da times(2)) e (iii) il tempo CPU del sistema (la somma dei valori tms_stimee tms_cstimein un struct tmscome restituito da times(2)). "

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.