Mám adresář obsahující velké množství souborů. Chci smazat všechny soubory kromě souboru.txt . Jak to udělám?
Existuje příliš mnoho souborů na odstranění nežádoucích jednotlivě a jejich názvy jsou příliš různorodé na to, aby bylo možné použít * k odstranění všech kromě tohoto jednoho souboru.
Někdo navrhl použít
rm !(file.txt)
ale to nejde. Vrací:
Badly placed ()'s
Můj operační systém je Scientific Linux 6.
Nějaké nápady?
Přijatá odpověď:
POSIXly:
find . ! -name 'file.txt' -type f -exec rm -f {} +
odstraní všechny běžné soubory (rekurzivně, včetně skrytých) kromě file.txt
. Chcete-li odstranit adresáře, změňte -type f
na -type d
a přidejte -r
možnost rm
.
V bash
, použijte rm -- !(file.txt)
, musíte povolit extglob:
$ shopt -s extglob
$ rm -- !(file.txt)
(nebo voláním bash -O extglob
)
Všimněte si, že extglob
funguje pouze v bash
a Korn shell family. A pomocí rm -- !(file.txt)
může způsobit Argument list too long
chyba.
V zsh
, můžete použít ^
pro negaci vzoru se zapnutou extendglob:
$ setopt extendedglob
$ rm -- ^file.txt
nebo pomocí stejné syntaxe jako ksh
a bash
s možnostmi ksh_glob
a no_bare_glob_qual
povoleno.