GNU/Linux >> Znalost Linux >  >> Linux

Jak odstranit více souborů najednou v Bash na Linuxu?

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.


Linux
  1. Jak komprimovat více souborů v systému Linux

  2. Jak přejmenovat více souborů najednou v Linuxu

  3. Jak otočit soubory protokolu Apache v Linuxu

  1. Jak spravovat soubory protokolu pomocí Logrotate v Linuxu

  2. Jak zapisovat soubory protokolu do RAM pomocí Log2ram v Linuxu

  3. Jak gzipovat všechny nebo konkrétní soubory v Linuxu

  1. Jak odstranit OBROVSKÉ (100-200 GB) soubory v Linuxu

  2. Jak najít a odstranit duplicitní soubory v Linuxu

  3. Jak přejmenovat více souborů dohromady v Linuxu pomocí 3 metod