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:
*
– 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é 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 |
:
*(seznam-vzorů)
– odpovídá žádnému nebo více výskytům zadaných vzorů?(seznam-vzorů)
– odpovídá žádnému nebo jednomu výskytu zadaných vzorů- +(seznam-vzorů) – odpovídá jednomu nebo více výskytům zadaných vzorů
@(seznam-vzoru)
– odpovídá jednomu ze zadaných vzorů!(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.