Pokud chcete smazat všechny soubory, jejichž názvy odpovídají určitému tvaru, zástupný znak (vzor glob) je nejpřímějším řešením. Několik příkladů:
$ rm -f abc.log.* # Remove them all
$ rm -f abc.log.2012* # Remove all logs from 2012
$ rm -f abc.log.2012-0[123]* # Remove all files from the first quarter of 2012
Regulární výrazy jsou silnější než zástupné znaky; můžete napájet výstup grep
do rm -f
. Pokud například některé názvy souborů začínají "abc.log"
a některé s "ABC.log"
, grep
umožňuje provést shodu bez rozlišení velkých a malých písmen:
$ rm -f $(ls | grep -i '^abc\.log\.')
To způsobí problémy, pokud některý z názvů souborů obsahuje vtipné znaky, včetně mezer. Buďte opatrní.
Když to udělám, spustím ls | grep ...
nejprve příkaz a zkontrolujte, zda produkuje výstup, který chci -- zejména pokud používám rm -f
:
$ ls | grep -i '^abc\.log\.'
(check that the list is correct)
$ rm -f $(!!)
kde !!
expanduje na předchozí příkaz. Nebo mohu napsat šipku nahoru nebo Ctrl-P a upravit předchozí řádek a přidat rm -f
příkaz.
To předpokládá, že používáte bash shell. Některé jiné shelly, zejména csh a tcsh a některé starší shelly odvozené od sh, nemusí podporovat $(...)
syntax. Můžete použít ekvivalentní syntaxi backtick:
$ rm -f `ls | grep -i '^abc\.log\.'`
$(...)
syntaxe je snáze čitelná a pokud jste opravdu ambiciózní, lze ji vnořit.
A konečně, pokud podmnožinu souborů, kterou chcete odstranit, nelze snadno vyjádřit regulárním výrazem, trik, který často používám, je uvést soubory do dočasného textového souboru a poté jej upravit:
$ ls > list
$ vi list # Use your favorite text editor
Poté mohu upravit list
soubor ručně, ponechat pouze soubory, které chci odstranit, a poté:
$ rm -f $(<list)
nebo
$ rm -f `cat list`
(Opět předpokládáme, že žádný z názvů souborů neobsahuje vtipné znaky, zejména mezery.)
Nebo při úpravě list
soubor, mohu přidat rm -f
na začátek každého řádku a poté:
$ . ./list
nebo
$ source ./list
Úprava souboru je také příležitostí přidat v případě potřeby uvozovky, například změnit rm -f foo bar
na rm -f 'foo bar'
.
Stačí použít víceřádkový výběr v sublime ke spojení všech souborů do jednoho řádku a přidat mezeru mezi názvy každého souboru a poté přidat rm
na začátku seznamu. To je většinou užitečné, když v názvech souborů není vzor, který chcete smazat.
[$]> rm abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28 abc.log.2012-03-29 abc.log.2012-03-30 abc.log.2012-04-02 abc.log.2012-04-04 abc.log.2012-04-05 abc.log.2012-04-09 abc.log.2012-04-10
Bash podporuje všechny druhy zástupných znaků a rozšíření.
Váš přesný případ by se řešil rozšířením složené závorky, například takto:
$ rm -rf abc.log.2012-03-{14,27,28}
Výše uvedené by se rozšířily na jeden příkaz se všemi třemi argumenty a bude ekvivalentní zadání:
$ rm -rf abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28
Je důležité poznamenat, že tuto expanzi provádí shell před rm
je dokonce načten.
Použijte zástupný znak (*
), aby odpovídalo více souborů.
Například níže uvedený příkaz odstraní všechny soubory s názvy začínajícími abc.log.2012-03-
.
rm -f abc.log.2012-03-*
Doporučuji spustit ls abc.log.2012-03-*
seznam souborů, abyste viděli, co se chystáte smazat, než spustíte rm
příkaz.
Další podrobnosti najdete na manuálové stránce Bash o rozšíření souboru.