Como excluir todos os arquivos, exceto um arquivo nomeado de uma pasta específica [duplicado]

43

Aqui está a situação.

Eu tenho um diretório que contém muitos arquivos com diferentes extensões. Desejo excluir todos os arquivos, exceto um com um nome específico.

Isto pode ser feito facilmente usando a GUI selecionando tudo e pressionando ctrl e desmarcando o arquivo em questão.

Isso é exatamente o que eu quero, mas como posso fazer isso a partir da linha de comando?

Por exemplo: dirA contém os seguintes arquivos:

a.txt
b.txt
c.php
d.html
a.db
b.db
e.html

Eu quero excluir todos os arquivos mantendo apenas o arquivo chamado a.txt .

    
por Maythux 16.05.2015 / 14:15

5 respostas

77

Eu vim com esse ótimo comando simples e fácil:

rm !(a.txt)

você pode usar! como uma negação

Teste a glob com eco primeiro, por exemplo,

echo !(a.txt)

Se isso não funcionar, para bash você pode precisar ativar isso com

shopt -s extglob

Se você quiser manter os dois a.txt e b.txt , use !(a.txt|b.txt) ou !([ab].txt) .

Editar:

para fazer rm funcionar recursivamente, basta adicionar -r like

rm -r !(a.txt)

e também, está trabalhando com pasta. só precisa mudar o nome para o nome do dir, como por a_dir

rm -r !(a_dir)
    
por Maythux 16.05.2015 / 14:21
17

Você pode tentar este comando:

find . \! -name 'a.txt' -delete

Mas você precisa ser cuidadoso porque o comando find é recursivo.

    
por cosmoscalibur 16.05.2015 / 14:22
10

Você pode fazer isso no terminal:

cd dirA 
export GLOBIGNORE=a.txt
rm *
export GLOBIGNORE=
    
por Sharad Gautam 16.05.2015 / 14:28
5

Você pode usar o comando:

find ! -name 'a.txt' -type f -exec rm -f {} +

Isso procurará arquivos ( -type f ) no diretório atual, exceto o arquivo a.txt ( ! -name 'a.txt ), e os removerá ( -exec rm -f {} + )

    
por shaddy 16.05.2015 / 14:20
4

Use find e xargs

find folder -type f -not -name 'a.txt' -print0 | xargs -0 rm

Para excluir várias coisas:

find folder -type f -not -name 'a.txt' -not -name 'b.txt' -print0 | xargs -0 rm

Isso também funciona com curingas:

find folder -type f -not -name '*.png' -not -name 'b.txt' -print0  | xargs -0 rm

Para pesquisar na pasta atual, use . no lugar de 'pasta'.

Fonte básica

    
por Tim 16.05.2015 / 14:21