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 :
*– odpovídá nule nebo více znakům?– odpovídá libovolnému jednotlivému znaku[seq]– odpovídá libovolnému znaku v seq[!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:
*(pattern-list)– odpovídá nule nebo více výskytům zadaných vzorů?(pattern-list)– odpovídá nule nebo jednomu výskytu zadaných vzorů- +(seznam-vzorů) – odpovídá jednomu nebo více výskytům zadaných vzorů
@(pattern-list)– odpovídá jednomu ze zadaných vzorů!(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.