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.