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. zsh
má rm
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.