GNU/Linux >> Znalost Linux >  >> Linux

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í rm , najít a globignore příkazy.

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é čtení: Použijte příkaz find k prohledání více názvů souborů/přípon v Linuxu

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é metody, které zde prozkoumáme, a mezi ně patří:

Odstranění souborů pomocí operátorů Extended Pattern Matching

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

  1. *(pattern-list) – odpovídá nule nebo více výskytům zadaných vzorů
  2. ?(pattern-list) – odpovídá nule nebo jednomu výskytu zadaných vzorů
  3. +(seznam-vzorů) – odpovídá jednomu nebo více výskytům zadaných vzorů
  4. @(pattern-list) – odpovídá jednomu ze zadaných vzorů
  5. !(pattern-list) – odpovídá čemukoli kromě jednoho z uvedených vzorů

Chcete-li je používat, povolte extglob shell takto:

# 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. Chcete-li odstranit všechny soubory s výjimkou název_souboru1 a název_souboru2 :

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

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

$ rm -i !(*.zip)

4. Dále můžete smazat všechny soubory v adresáři kromě všech .zip a .odt soubory následovně, při zobrazení toho, co se právě provádí:

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

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

$ shopt -u extglob

Odstranění souborů pomocí příkazu Find Linux

V rámci této metody můžeme použít příkaz find výhradně s příslušnými volbami nebo ve spojení s xargs příkaz pomocí 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 smaže všechny soubory kromě .gz soubory v aktuálním adresáři:

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

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

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

7. Podívejme se na jeden další příklad, příkaz níže 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

Odstranění souborů pomocí proměnné Bash GLOBIGNORE

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

Doporučené čtení: 12 užitečných praktických příkladů příkazu Grep v Linuxu

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

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

V tomto případě všechny soubory jiné než .odt , .iso a .txt soubory, které budou odstraněny z aktuálního adresáře.

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

$ rm -v *

Poté vypněte GLOBIGNORE proměnná:

$ unset GLOBIGNORE

Poznámka :Abyste pochopili 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 na mysli nějaké další techniky příkazového řádku pro stejný účel, nezapomeňte se s námi podělit prostřednictvím naší sekce zpětné vazby níže.


Linux
  1. Jak odebrat všechny soubory ve složce kromě jednoho konkrétního souboru v systému Linux

  2. Jak přesunout všechny soubory (včetně skrytých) z jednoho adresáře do druhého?

  3. Smazat všechny soubory ve složce kromě posledních (nejnovějších) 20?

  1. Jak odstranit všechny soubory s konkrétní příponou v konkrétní složce?

  2. Smazat staré soubory protokolu kromě posledního (alfanumericky seřazené)?

  3. Jak odstranit všechny soubory kromě jednoho pojmenovaného souboru z konkrétní složky?

  1. Rozbalte všechny soubory v adresáři

  2. Smažte všechny soubory kromě nejnovějších 3 v bash skriptu

  3. Můžete změnit oprávnění ke všem souborům kromě jednoho adresáře v Linuxu?