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