Můžete nastat situaci, kdy budete chtít odstranit více souborů, které mají konkrétní příponu. Přesně to vám pomůže tento tutoriál.
Pomocí příkazu rm odstraníte soubory a složky následujícím způsobem:
rm [option] filename
Může to vypadat, že zde potřebujete znát přesné názvy souborů, ale to není pravda.
Dovolte mi ukázat vám několik způsobů, jak odstranit více souborů na základě jejich přípony.
Metoda 1:Odebrání souborů podle přípony pomocí příkazu rm
V mém příkladu mám spoustu souborů gif, které končí příponami .gif.
K jejich odstranění mohu použít příkaz rm takto:
rm *.gif
Odstraňování souborů naslepo by mohlo být riskantní. Vždy je dobré nejprve zjistit, jaké soubory budou smazány pomocí příkazu ls:
ls *.gif
Zde je návod, jak smažu soubory s příponou .gif:
$ ls
1.gif 2.gif 3.gif 4.gif a.jpg b.png c.webp
$ ls *.gif
1.gif 2.gif 3.gif 4.gif
$ rm -v *.gif
removed '1.gif'
removed '2.gif'
removed '3.gif'
removed '4.gif'
$ ls
a.jpg b.png c.webp
To lze provést pro jakoukoli příponu souboru, nejen pro .gif. Můžete dokonce kombinovat více rozšíření.
$ ls
f1.txt f2.txt f3.txt f4.txt not-txt-file.pdf random.txt
$ rm -v *.txt *.pdf
removed 'f1.txt'
removed 'f2.txt'
removed 'f3.txt'
removed 'f4.txt'
removed 'not-txt-file.pdf'
$ ls
random.txt
💡Můžete použít interaktivní možnost -i s příkazem rm, který požaduje potvrzení před odstraněním každého souboru. To však nemusí být vhodné, pokud máte mnoho souborů k odstranění. Zajímá vás, jak to funguje? Zástupné znaky!
Stručně řečeno, zástupný znak je speciální znak, který používáte ke shodě s konkrétním vzorem. Níže je několik často používaných zástupných znaků:
Wilcard | Použít |
---|---|
* | Odpovídá jednomu nebo více výskytům |
? | Shoda s jedním výskytem |
[] (hranaté závorky) | Zadejte rozsah pro shodu |
^ | Vyloučit ze shody |
Zde jste použili zástupný znak *, což znamená, že se může shodovat s jedním nebo více výskyty jakéhokoli znaku.
Když řeknete *.gif
, znamená libovolnou kombinaci písmen, která vede až k .gif
. Jinými slovy, poskytuje vám všechny soubory s příponou .gif
.
Každý zástupný znak lze použít navíc k dalším zástupným znakům. Ale nezabírejme teď do těchto podrobností.
Ta tečka mezi * a rozšířením je důležitá!
Mnoho lidí dělá chybu v záměně *.gif
s *gif
. Toto není správné. Tečka (.) mezi * a názvem rozšíření je zásadní.
Vezměte scénář s následujícími soubory a podívejte se, co se stane, když použiji regulární výraz *gif
místo *.gif
:
$ ls
1.gif 2.gif 3.gif 4.gif definately-not-a-gif jpg-not-gif not-a-gif
$ rm -v *gif
removed '1.gif'
removed '2.gif'
removed '3.gif'
removed '4.gif'
removed 'definately-not-a-gif'
removed 'jpg-not-gif'
removed 'not-a-gif'
Smazal také soubory s řetězcem gif
v něm, i když to nebyla přípona souboru, měl pouze gif na konci názvu souboru bez předchozí tečky.
Když odstraňujete soubory se zástupnými znaky nebo regulárním výrazem, ujistěte se, že jste byli co nejpřesnější.
Metoda 2:Rekurzivně odstraňte soubory s konkrétní příponou pomocí příkazu find
Příkaz rm odstraní pouze soubory v aktuálním adresáři. Neodstraní soubory z podadresářů, a to ani s rekurzivní možností.
Chcete-li rekurzivně odstranit soubory s určitou příponou, můžete zkombinovat příkaz find a příkaz rm:
Zde je příklad, kdy mám v podadresářích také soubory .gif.
$ ls *
file_0.gif file_z.txt not-a-gif not-a-txt
dir1:
file_1.gif file_a.txt not-a-gif not-a-txt
dir2:
file_2.gif file_b.txt not-a-gif not-a-txt
dir3:
file_3.gif file_c.txt not-a-gif not-a-txt
dir4:
file_4.gif file_d.txt not-a-gif not-a-txt
Chcete-li soubory odstranit, můžete použít příkaz find takto:
find . -type f -name "*.gif" -exec rm -v {} \;
Zde je výstup, když jsem spustil příkaz:
$ find . -type f -name "*.gif" -exec rm -v {} \;
removed './dir1/file_1.gif'
removed './dir3/file_3.gif'
removed './dir2/file_2.gif'
removed './file_0.gif'
removed './dir4/file_4.gif
Pojďme to rozebrat.
- Tečka za "najít" znamená hledat v aktuálním adresáři
- Příznak "-name" určuje název souboru, kde můžeme použít regulární výraz
- Příznak "-exec" se používá k provedení příkazu bash na základě výsledku příkazu find
- Složené závorky "{}" fungují jako zástupný symbol pro výsledek shodných souborů, takže "rm -v {}" smaže soubory, které našli nalezený příkaz.
- Nakonec středník ukončí příkaz prováděný vaším shellem (příkaz po exec) a použije se zpětné lomítko '\', aby byl středník správně ukončen. Neměli byste si s tím dělat starosti.
Další příklady příkazu find se můžete dozvědět v níže uvedeném tutoriálu.
Pokročilý bonusový tip:Použijte příkaz find k práci se soubory s více příponami
Výše uvedený příkaz nepokrývá hledání souborů s více příponami, něco jako "rm *.gif *.txt"
Chcete-li toho dosáhnout, můžete použít -o
argument, který znamená „logický operátor OR“. Ale také musíme použít zpětné lomítko '\', abychom opustili závorky
$ ls *
file_0.gif file_z.txt not-a-gif not-a-txt
dir1:
file_1.gif file_a.txt not-a-gif not-a-txt
dir2:
file_2.gif file_b.txt not-a-gif not-a-txt
dir3:
file_3.gif file_c.txt not-a-gif not-a-txt
dir4:
file_4.gif file_d.txt not-a-gif not-a-txt
$ find . \( -name "*.gif" -o -name "*.txt" \) -exec rm -v {} \;
removed './dir1/file_1.gif'
removed './dir1/file_a.txt'
removed './dir3/file_3.gif'
removed './dir3/file_c.txt'
removed './dir2/file_2.gif'
removed './dir2/file_b.txt'
removed './file_0.gif'
removed './file_z.txt'
removed './dir4/file_d.txt'
removed './dir4/file_4.gif'
Zde můžete vidět, že všechny soubory s příponou 'txt' a soubory s příponou 'gif' jsou rekurzivně odstraněny.
Vím, že budete mít pocit, že použití příkazu find zvlášť pro každý typ přípony souboru by bylo jednodušší a nemýlíte se.
Závěr
Tento článek se zabýval odstraňováním souborů s konkrétní příponou. Podívali jsme se také na rekurzivní vyhledávání a odstraňování těchto souborů.
„S velkou mocí přichází velká zodpovědnost“ , pamatujte na to, když používáte zástupné znaky a regulární výraz. Jeden překlep a důležité soubory mohou být neúmyslně smazány.