GNU/Linux >> Znalost Linux >  >> Linux

Jaký je nejrychlejší způsob odstranění všech souborů a podsložek v adresáři?

Nejrychlejší způsob, jak je z tohoto adresáře odstranit, je přesunout je odtamtud a poté je jednoduše odstranit na pozadí:

mkdir ../.tmp_to_remove
mv -- * ../.tmp_to_remove
rm -rf ../.tmp_to_remove &

To předpokládá, že váš aktuální adresář není nejvyšší úrovní nějakého připojeného oddílu (tj. ../.tmp_to_remove je na stejném souborovém systému).

-- po mv (upravené Stéphanem) je nezbytné, pokud máte nějaké názvy souborů/adresářů začínající na - .

Výše uvedené odstraní soubory z vašeho aktuálního adresáře ve zlomku sekundy, protože nemusí rekurzivně zpracovávat podadresáře. Skutečné odstranění stromu ze souborového systému trvá déle, ale protože je mimo cestu, na jeho skutečné účinnosti by nemělo tolik záležet.


rsync je překvapivě rychlý a jednoduchý. Nejprve musíte vytvořit prázdný adresář,

mkdir emptydir
rsync -a --delete emptydir/ yourdirectory/

yourdirectory/ je adresář, ze kterého chcete soubory odstranit.


Jeden problém s rm -rf * , nebo jeho správnější ekvivalent rm -rf -- * je, že shell musí nejprve vypsat všechny (neskryté) soubory v aktuálním adresáři, seřadit je a předat rm , což, pokud je seznam souborů v aktuálním adresáři velký, přidá nějakou zbytečnou režii navíc a může dokonce selhat, pokud je seznam souborů příliš velký.

Normálně byste udělali rm -rf . místo toho (což by také mělo výhodu odstranění skrytých souborů). Ale nejvíce rm implementace včetně všech vyhovujících POSIX to odmítnou. Důvodem je, že některé shelly (včetně všech POSIXových) mají tu chybu, že rozšíření .* glob by zahrnoval . a .. . Což by znamenalo, že rm -rf .* by smazal aktuální a nadřazený adresář, takže rm byl upraven tak, aby tuto vadu těchto shellů obcházel.

Některé shelly jako pdksh (a další deriváty Forsyth shell), zsh nebo fish nemít tu vadu. zshrm vestavěný, který můžete povolit pomocí autoload zsh/files to od zsh 's .* nezahrnuje . ani .. funguje OK s rm -rf . . Tedy v zsh , můžete:

autoload zsh/files
rm -rf .

V systému Linux můžete:

rm -rf /proc/self/cwd/

vyprázdnit aktuální adresář nebo:

rm -rf /dev/fd/3/ 3< some/dir

vyprázdnit libovolný adresář.

(všimněte si koncového / )

Na systémech GNU můžete:

find . -delete

Pokud má aktuální adresář pouze několik položek a většina souborů je v podadresářích, nebude to mít žádný významný rozdíl a rm -rf -- * bude pravděpodobně nejrychlejší, co můžete získat. Očekává se pro rm -rf (nebo cokoli, co odstraní každý soubor), aby to bylo drahé, protože to znamená čtení obsahu všech adresářů a volání unlink() na každém vstupu. unlink() sám o sobě může být docela drahý, protože zahrnuje úpravu inodu smazaného souboru, adresáře obsahujícího soubor a nějakou mapu souborového systému nebo jiné oblasti, které jsou volné.

rm a find (alespoň implementace GNU) již třídí seznam souborů podle čísla inodu v každém adresáři, což může znamenat obrovský rozdíl z hlediska výkonu na souborových systémech ext4, protože snižuje počet změn v zařízeních základního bloku při po sobě jdoucích (nebo zavřených) k sobě navzájem) jsou inody modifikovány postupně.

rsync seřadí soubory podle názvu, což by mohlo drasticky snížit výkon, pokud se pořadí podle názvu neshoduje s pořadím podle počtu (jako když byly soubory vytvořeny z setříděného seznamu názvů souborů).

Jeden důvod, proč rsync může být v některých případech rychlejší je to, že se nezdá, že by podnikl bezpečnostní opatření, aby se vyhnul podmínkám závodu, které by mohly způsobit sestup do nesprávného adresáře, pokud by byl adresář nahrazen symbolickým odkazem, zatímco funguje jako rm nebo find udělat.

Pro další optimalizaci:

Pokud znáte maximální hloubku svého adresářového stromu, můžete ji předat find :

find . -maxdepth 3 -delete

To ušetří find muset zkoušet a číst obsah adresářů do hloubky 3.


Linux
  1. Proč může Rm odebrat soubory pouze pro čtení?

  2. Nejrychlejší způsob, jak extrahovat Iso?

  3. Získat všechny soubory kromě souborů v poli – Bash?

  1. Jaký je nejrychlejší způsob spojení dvou nebo více souborů v Linuxu?

  2. Jaký je nejrychlejší způsob, jak v Linuxu přesunout milion obrázků z jednoho adresáře do druhého?

  3. Jaký má smysl šifrování domovského adresáře?

  1. Jaký je nejlepší způsob, jak spočítat počet souborů v adresáři?

  2. Jaký je nejlepší způsob, jak znovu spojit soubory po jejich rozdělení?

  3. Jaký je nejúčinnější způsob, jak přesunout velké množství souborů, které jsou umístěny v jednom adresáři?