GNU/Linux >> Linux Esercitazione >  >> Linux

In che modo Rm -r esegue la rimozione ricorsiva? In che ordine?

C'è un ordine di operazioni da rm ? Ho eseguito rm su una directory di grandi dimensioni e sono curioso di sapere dove dovrei guardare per vedere cosa potrebbe essere stato eliminato. rm lavorare prima sui file, poi sulle directory? O si basa su alcune informazioni nella tabella degli inode?

Specifiche:rm da GNU coreutils 8.22
sistema:Arch Linux in esecuzione su un filesystem beagleboneblack
che operava su un HDD Seagate esterno (ext4) che utilizzava USB 2.0.

Retroscena:

Stavo eseguendo una pulizia della directory e l'ho eseguita

cp -r A/ B/ C/ Dest/

Inconsapevolmente, l'ho seguito con

rm -r A/ B/ C/ Dest/

quando intendevo semplicemente esibirmi

rm -r A/ B/ C/

L'ho preso e ho premuto Ctrl +C prima che troppo tempo fosse passato. In particolare, sono passati <3 secondi mentre stavo usando il time comando insieme a rm &cp . Sono entrato ed ho esaminato Dest/ aspettandosi che fosse inesistente, ma ecco, era intero e apparve per non essere influenzato. Questo è un po' sorprendente come A/ B/ C/ erano piuttosto piccoli. Forse 100–200 MB in totale. Dest/ tuttavia, è poco meno di 1 TB. Esecuzione di un ls su Dest/ ha mostrato che c'erano sia file che directory a entrambe le estremità dell'alfabeto (ad es. AFile.txt …. …. Zoo.txt ).

Sono stato fortunato e ho cancellato il rm prima che provocasse il caos nella mia directory Dest/? È rm davvero così lento (per fortuna!)?

In caso contrario, come fa rm andare a rimuovere ricorsivamente le cose in modo da poter indovinare cosa potrebbe essere andato perso?

Non mi aspetto davvero di recuperare ciò che potrei aver perso, sono solo curioso di sapere cosa è stato potenzialmente spazzato via.

Risposta accettata:

rm -r lavora a turno su ciascuno dei suoi argomenti. Se un argomento è una directory, elenca la directory (con il opendir e readdir funzioni o un metodo equivalente) e opera a turno su ciascuna voce. Se una voce è una directory, esplora quella voce in modo ricorsivo.

Questo è esattamente lo stesso metodo utilizzato da altre applicazioni per attraversare le directory in modo ricorsivo — find , ls -Rf , ecc.

L'ordine di attraversamento è imprevedibile. Sulla maggior parte dei filesystem, l'ordine è riproducibile fintanto che nessun file viene aggiunto, rimosso o rinominato nella directory (l'ordine potrebbe in teoria essere completamente casuale e cambiare ogni volta, ma non riesco a pensare a un filesystem in cui ciò avvenga). Su alcuni filesystem, l'ordine può essere generalmente dedotto dai nomi dei file o dall'ordine in cui i file sono stati creati o da una combinazione di entrambi, ma è necessario conoscere i minimi dettagli del filesystem e può variare a seconda di la versione del driver. L'ordine di attraversamento non è qualcosa su cui puoi fare affidamento.

Correlati:Ottimizzazione della dimensione del settore logico per la dimensione del settore fisico 4096 HDD?

Nota che ls o echo * ordina i file nell'ordine lessicografico dei loro nomi. find e ls -f non ordinare.

L'unica cosa su cui puoi fare affidamento è che gli argomenti sono gestiti in ordine. Quindi se C/ era ancora parzialmente lì, significherebbe che Dest/ era intatto. Se C/ è sparito, puoi farti un'idea di dove i file sono stati rimossi in Dest/ controllando i tempi di modifica della directory e confrontandoli con l'ora C/ è stato eliminato o l'ora in cui la copia è terminata. Il primo file da eliminare potrebbe essere un file direttamente in Dest/ o da qualche parte in profondità nella gerarchia a seconda che sia la prima voce in Dest/ quel rm è successo a attraversare era una directory o meno.

La velocità di rm è principalmente una questione di quanti file ci sono da eliminare. Ci vuole un file molto grande per avere un impatto notevole sul tempo di eliminazione. La maggior parte del lavoro consiste nell'eliminare a turno ogni voce di directory. I dati del file non vengono cancellati, la cancellazione del contenuto di un file richiede solo di contrassegnare come liberi i blocchi che stava utilizzando, il che è relativamente veloce.


Linux
  1. Che cos'è un Makefile e come funziona?

  2. Cosa fa Eco $? Fare??

  3. Come funziona rm? Cosa fa rm?

  4. Come scoprire quale file si trova su un particolare settore

  5. Cosa fa kill -- -0?

Che cos'è Hadoop Mapreduce e come funziona

Comando file Linux:cosa fa e come usarlo

Cos'è Docker? Come funziona?

Che cos'è il comando sorgente in Linux e come funziona?

Come funziona un sistema di bilanciamento del carico? Che cos'è il bilanciamento del carico?

Come vedere cosa fa il client DHCP?