Eu sei como excluir todos os txt
arquivos do diretório atual por rm *.txt
. Alguém sabe como excluir todos os arquivos do diretório atual EXCETO txt
arquivo?
Comentários
Resposta
Você pode usar find
:
find . -type f ! -name "*.txt" -delete
Ou os recursos estendidos de globbing do bash:
shopt -s extglob rm *.!(txt)
Ou em zsh:
setopt extendedglob rm *~*.txt(.) # || ^^^ Only plain files # ||^^^^^ files ending in ".txt" # | \Except # \Everything
Comentários
- Alguns deles podem precisar ser adaptados, dependendo se você tem pastas e o que deseja fazer com elas.
- Deveria ' t
*.!(txt)
be!(*.txt)
? - @LauriRanta depende do que ' s na pasta, que temos ' não obtive uma resposta para. É ' bem como se todos os arquivos tivessem extensões e
rm
engasgaria se houvesse pastas. - Eu ' tenho um problema com os colchetes. Quando eu uso o estilo globbing em um script bash, ele reclama sobre um erro de sintaxe e os parênteses. No entanto, fazer isso a partir da CLI funciona.
- @izogfif verifique se isso
find . -type f ! -name "*.txt" | xargs -r rm
funcionaria no GNU \ xargs. Os comandos BSD e UNIX xargs podem não ter -r, você deve verificar suaman xargs
Resposta
Se você deseja apenas excluir todos os arquivos exceto “* .txt”, você pode use o seguinte comando:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
mas se você também deseja excluir diretórios junto com os arquivos, então você pode usar isto:
$ find . ! -name "*.txt" -exec rm -r {} \;
Resposta
Existem muitas maneiras de fazer isso. mas a maneira mais simples seria (bash):
shopt -s extglob rm !(*.txt)
Comentários
- Como posso usar isso para especificar várias extensões?
-
shopt -s extglob
é poderoso. tecmint.com/… fornece bons exemplos. Para excluir tudo, exceto certas extensões,rm -v !(*.zip|*.odt)
funciona.
Resposta
Você pode usar grep e xargs invertidos
ls | grep -v .txt$| xargs rm
Comentários
-
ls | grep -v *.txt | xargs rm
funciona tão bem - @phillipsk
grep -v *.txt
funcionará apenas se ' s exatamente um.txt
arquivo. Se não houver nenhum,grep
usará*.txt
como o padrão; se houver ' s mais de um, ele pesquisará o primeiro nome de arquivo dentro de todos os outros.txt
arquivos, ignorando a saída dels
. (Os resultados exatos podem depender das ' opções globais do shell.) -
.txt$
corresponderá a strings que terminam comtxt
independentemente do ponto. Porquegrep
aceita expressão regular como parâmetro. Portanto, os arquivosa.txt
eaatxt
ea-txt
serão todos correspondidos por esta expressão. A expressão correta deve serls | grep -v \\.txt$ | xargs --no-run-if-empty rm
. Para pessoas curiosas: se você quiser brincar com a expressão com segurança, use esta expressão de testels | grep \\.txt$ | xargs --no-run-if-empty echo
(observação: há ' s não-v
sinalizador erm=>echo
). Nota2: você deve ter notado barra invertida dupla. Um é para regex, outro é para bash escapar da barra.
Resposta
Uma solução sem find
:
mv dir/*.txt otherdir/ rm -r dir mv otherdir dir
Isso deve funcionar em todos os tipos de shells.
Resposta
Basta fazer:
rm $(ls -I "*.txt" )
# Exclui tipo de arquivo, exceto * .txt
Da mesma forma, se precisar excluir “exceto um ou mais tipos de arquivo”, faça:
rm $(ls -I "*.txt" -I "*.pdf" )
#Exclui tipos de arquivo exceto * .txt & * .pdf
Comentários
- Bem-vindo ao StackExchange!A opção
-I
pode ser útil, mas veja por que não analisar ls . E o que| xargs
consegue? Sem nenhum argumento, ele apenas executaecho
em todas as suas entradas. - O que
xargs
deve alcançar? - Obrigado, xargs não foi útil no caso acima, corrigiu agora.
Resposta
Isso também funciona para remover todos os ocultos (ponto) arquivos e pastas, exceto o declarado (.mydir
):
rm -rf $(ls -aI ".mydir")
ls
antes de realmente tentar chamarrm
.