GNU/Linux >> Znalost Linux >  >> Linux

Jak probíhá rekurzivní odstraňování Rm -r? V jakém pořadí?

Existuje nějaké pořadí operací pro rm ? Provedl jsem rm ve velkém adresáři a jsem zvědavý, kde bych se měl podívat, abych zjistil, co mohlo být odstraněno. Má rm pracovat nejprve na souborech, pak na adresářích? Nebo je to založeno na nějakých informacích v tabulce inodů?

Specifikace:rm z GNU coreutils 8.22
systém:Arch Linux běžící na souborovém systému beagleboneblack
byl externí pevný disk Seagate (ext4) využívající USB 2.0.

Historie:

Prováděl jsem nějaké vyčištění adresáře a provedl

cp -r A/ B/ C/ Dest/

Nevědomky jsem na to navázal pomocí

rm -r A/ B/ C/ Dest/

když jsem chtěl jednoduše vystupovat

rm -r A/ B/ C/

Zachytil jsem to a zmáčkl Ctrl +C než uplynulo příliš dlouho. Konkrétně to bylo <3 sekundy, když jsem používal time příkaz ve spojení s rm &cp . Šel jsem dovnitř a prozkoumal Dest/ očekávali, že nebude existovat, ale hle, bylo to celé a objevilo se aby nebyl ovlivněn. To je trochu překvapivé jako A/ B/ C/ byly docela malé. Celkem možná 100–200 MB. Dest/ má však jen 1 TB. Provedení ls on Dest/ ukázal, že na obou koncích abecedy jsou soubory i adresáře (např. AFile.txt …. …. Zoo.txt ).

Měl jsem štěstí a zrušil jsem rm než to způsobilo zkázu v mém adresáři Dest/? Je rm opravdu tak pomalé (naštěstí!)?

Pokud ne, jak to funguje rm jít o rekurzivní odstraňování věcí, abych mohl odhadnout, co mohlo být ztraceno?

Opravdu neočekávám, že obnovím to, co jsem mohl ztratit, jsem zvědavý, co bylo potenciálně odfouknuto.

Přijatá odpověď:

rm -r postupně pracuje na každém ze svých argumentů. Pokud je argumentem adresář, vypíše adresář (s opendir a readdir funkce nebo nějakou ekvivalentní metodu) a působí postupně na každou položku. Pokud je záznam adresář, prozkoumá tento záznam rekurzivně.

Toto je přesně stejná metoda, kterou jiné aplikace používají k rekurzivnímu procházení adresářů — find , ls -Rf , atd.

Pořadí průchodu je nepředvídatelné. Na většině souborových systémů je pořadí reprodukovatelné, pokud není v adresáři přidán, odstraněn nebo přejmenován žádný soubor (pořadí by teoreticky mohlo být zcela náhodné a pokaždé se měnit, ale nenapadá mě souborový systém, kde by se to stalo). Na několika souborových systémech lze pořadí obecně odvodit z názvů souborů nebo z pořadí, ve kterém byly soubory vytvořeny, nebo z kombinace obou, ale musíte znát jemné detaily souborového systému a může se lišit v závislosti na verzi ovladače. Pořadí procházení není něco, na co se můžete spolehnout.

Související:Optimalizace velikosti logického sektoru pro velikost fyzického sektoru 4096 HDD?

Všimněte si, že ls nebo echo * třídit soubory v lexikografickém pořadí podle jejich jmen. find a ls -f neřadit.

Jediná věc, na kterou se můžete spolehnout, je, že argumenty jsou zpracovány v pořádku. Pokud tedy C/ byl tam stále částečně, znamenalo by to, že Dest/ byla nedotčená. Pokud C/ je pryč, můžete si udělat představu o tom, kde byly soubory odstraněny v Dest/ zkontrolováním časů modifikace adresáře a jejich porovnáním s časem C/ byl smazán nebo čas ukončení kopírování. První soubor, který má být odstraněn, může být soubor přímo v Dest/ nebo někde hluboko v hierarchii v závislosti na tom, zda je první záznam v Dest/ že rm náhodně prošel, zda byl adresář nebo ne.

Rychlost rm jde většinou o to, kolik souborů je k odstranění. Vyžaduje to velmi velký soubor, aby měl znatelný dopad na dobu mazání. Hlavní část práce spočívá v postupném mazání každé položky adresáře. Data souboru nejsou vymazána, vymazání obsahu souboru vyžaduje pouze označení bloků, které používal, jako volné, což je relativně rychlé.


Linux
  1. Co je webový server a jak webový server funguje?

  2. Jak zjistit, co dělá příkaz Linuxu

  3. Co dělá Echo $? Dělat??

  1. Co je DNS a jak funguje?

  2. Jak rm funguje? Co dělá rm?

  3. Jak zjistit, jaký soubor je v konkrétním sektoru

  1. Co je Makefile a jak funguje?

  2. Co je NGINX? Jak to funguje?

  3. Co dělá zabít -- -0?