Eu tenho um diretório que contém um grande número de arquivos. Quero excluir todos os arquivos, exceto o arquivo.txt. Como eu faço isso?
Existem muitos arquivos para remover os indesejados individualmente e seus nomes são muito diversos para serem usados * para removê-los todos, exceto esse arquivo.
Alguém sugeriu o uso
rm !(file.txt)
Mas isso não funciona. Retorna:
Badly placed ()'s
Meu SO é o Scientific Linux 6.
Alguma ideia?
file-management
Kantura
fonte
fonte
Respostas:
POSIXly:
irá remover todos os arquivos regulares (recursivamente, incluindo os ocultos), exceto
file.txt
. Para remover diretórios, mude-type f
para-type d
e adicione a-r
opção arm
.Em
bash
, para usarrm -- !(file.txt)
, você deve ativar o extglob :(ou chamando
bash -O extglob
)Observe que
extglob
só funciona nabash
família shell Korn. E o usorm -- !(file.txt)
pode causar umArgument list too long
erro.Em
zsh
, você pode usar^
para negar padrão com o extendedglob ativado:ou usando a mesma sintaxe com
ksh
ebash
com as opçõesksh_glob
eno_bare_glob_qual
ativado.fonte
rm
tãoecho rm
vez, e pedir às pessoas para levar apenas o eco quando eles são realmente certeza de que ele vai fazer o que eles querem. Fora isso, +1 para obter uma resposta completa-delete
em vez de-exec
, mais curto e mais fácil de lembrar-delete
não é definido pelo POSIX.find
solução do Gnouc, você pode fazer! \( -name one_file -o -name two_file \)
e assim por diante.Outra tomada em uma direção diferente (se não houver espaços nos nomes dos arquivos)
ou (funciona mesmo se houver espaços nos nomes dos arquivos)
de
man grep
:fonte
ls | grep -v "a file with spaces.bin" | xargs rm
. Essa é agrep
sintaxe normal .grep
masrm
.rm
receberá uma lista de argumentos separados por espaço. Tentetouch 'a b'; touch 'c d'; ls | grep -v 'a b' | xargs rm
: você terárm: c: No such file or directory
erm: d: No such file or directory
-print0
dentrofind
e-0
dentroxargs
. Aqui está uma solução alternativa, mas é um pouco inconveniente.find . -maxdepth 1 -type f | grep -v 'a b' | tr '\n' '\0' | xargs -0 rm
. By the way, gnuparallel
alças isso muito bem (eu quase sempre usá-lo como um substituto para xargs:ls | grep -v 'a b' | parallel rm
-
.Mantenha uma cópia, exclua tudo, restaure a cópia:
Em uma linha:
Mas isso requer um shell que suporte as strings here.
fonte
rm
etar -x
.rm
pode falhar o quanto quiser.você está pensando demais nisso.
Feito.
EDIT Na verdade, mais fácil:
fonte
No meu sistema operacional Scientific Linux 6, isso funciona:
Eu também tenho o Debian 32bit instalado em uma máquina virtual. O acima não funciona, mas o seguinte:
fonte
find
solução que dei não funcionou?file.txt
Ou qualquer outra coisa?shopt
não é umtcsh
builtin.Use em
rm !("file.txt")
vez derm !(file.txt)
fonte
shopt -s extglob
. De qualquer forma, citar um nome de arquivo simples como esse não faria diferença.Apenas para dar uma resposta diferente, você pode usar o comportamento padrão de
rm
que ele não excluirá pastas:fonte
Acho que essa abordagem é muito simples, funciona e não requer extensões especiais (que eu saiba!)
fonte