Vyhledávání na webu

3 způsoby, jak odstranit všechny soubory v adresáři kromě jednoho nebo několika souborů s příponami


Někdy se dostanete do situace, kdy potřebujete smazat všechny soubory v adresáři nebo jednoduše vyčistit adresář odstraněním všech souborů kromě souborů daného typu (končících určitou příponou).

V tomto článku vám ukážeme, jak odstranit soubory v adresáři kromě určitých přípon nebo typů souborů pomocí příkazů rm, find a globignore.

Než se posuneme dále, začněme tím, že se krátce podíváme na jeden důležitý koncept v Linuxu – porovnávání vzorů názvů, které nám umožní vypořádat se s naším problémem.

Doporučená četba: Použijte příkaz find k vyhledání více názvů souborů/přípon v systému Linux

V Linuxu je vzor shellu řetězec, který se skládá z následujících speciálních znaků, které se označují jako zástupné znaky nebo metaznaky:

  1. * – odpovídá nule nebo více znakům
  2. ? – odpovídá libovolnému jednotlivému znaku
  3. [seq] – odpovídá libovolnému znaku v seq
  4. [!seq] – odpovídá libovolnému znaku, který není v seq

Existují tři možné způsoby, které zde prozkoumáme, a mezi ně patří:

Odstraňte soubory pomocí operátorů Extended Pattern Matching

Níže jsou uvedeny různé rozšířené operátory shody vzorů, kde seznam-vzorků je seznam obsahující jeden nebo více názvů souborů oddělených znakem |:

  1. *(seznam-vzorů) – odpovídá žádnému nebo více výskytům zadaných vzorů
  2. ?(seznam-vzorů) – odpovídá žádnému nebo jednomu výskytu zadaných vzorů
  3. +(seznam-vzorů) – odpovídá jednomu nebo více výskytům zadaných vzorů
  4. @(seznam-vzoru) – odpovídá jednomu ze zadaných vzorů
  5. !(seznam-vzorů) – odpovídá čemukoli kromě jednoho z daných vzorů

Chcete-li je použít, povolte možnost shellu extglob následovně:

shopt -s extglob

1. Chcete-li odstranit všechny soubory v adresáři kromě názvu souboru, zadejte následující příkaz:

rm -v !("filename")

2. Postup smazání všech souborů s výjimkou název_souboru1 a název_souboru2:

rm -v !("filename1"|"filename2") 

3. Níže uvedený příklad ukazuje, jak interaktivně odstranit všechny soubory kromě všech souborů .zip:

rm -i !(*.zip)

4. Dále můžete smazat všechny soubory v adresáři kromě všech souborů .zip a .odt následujícím způsobem a přitom zobrazovat, co se právě děje Hotovo:

rm -v !(*.zip|*.odt)

Jakmile budete mít všechny požadované příkazy, vypněte možnost shellu extglob takto:

shopt -u extglob

Odstraňte soubory pomocí příkazu find v systému Linux

V rámci této metody můžeme použít příkaz find výhradně s příslušnými možnostmi nebo ve spojení s příkazem xargs použitím potrubí jako ve formulářích níže:

find /directory/ -type f -not -name 'PATTERN' -delete
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}

5. Následující příkaz odstraní všechny soubory kromě souborů .gz v aktuálním adresáři:

find . -type f -not -name '*.gz'-delete

6. Pomocí potrubí a xargů můžete výše uvedený případ upravit následovně:

find . -type f -not -name '*gz' -print0 | xargs -0  -I {} rm -v {}

7. Podívejme se na jeden další příklad, níže uvedený příkaz vymaže všechny soubory kromě .gz, .odt a .jpg soubory v aktuálním adresáři:

find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete

Odstraňte soubory pomocí proměnné Bash GLOBIGNORE

Tento poslední přístup však funguje pouze s bash. Zde proměnná GLOBIGNORE ukládá seznam vzorů (názvů souborů) oddělený dvojtečkou, který má být při rozšíření názvu cesty ignorován.

Doporučená četba: 12 užitečných praktických příkladů příkazu Grep v systému Linux

Chcete-li použít tuto metodu, přesuňte se do adresáře, který chcete vyčistit, a poté nastavte proměnnou GLOBIGNORE následovně:

cd test
GLOBIGNORE=*.odt:*.iso:*.txt

V tomto případě budou z aktuálního adresáře odstraněny všechny soubory kromě souborů .odt, .iso a .txt.

Nyní spusťte příkaz pro vyčištění adresáře:

rm -v *

Poté vypněte proměnnou GLOBIGNORE:

unset GLOBIGNORE

Poznámka: Chcete-li pochopit význam příznaků použitých ve výše uvedených příkazech, podívejte se na manuálové stránky každého příkazu, který jsme použili v různých ilustracích.

To je vše! Pokud máte pro stejný účel na mysli nějaké další techniky příkazového řádku, nezapomeňte se s námi podělit prostřednictvím níže uvedené sekce zpětné vazby.