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é.