No linux, como deletar todos os arquivos EXCETO o pattern * .txt?

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

  • Como sempre, teste as respostas fornecidas com um comando inofensivo como ls antes de realmente tentar chamar rm.
  • ^ Isso cara não ' não gosta de viver perigosamente .. 🙂

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 sua man 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 de ls. (Os resultados exatos podem depender das ' opções globais do shell.)
  • .txt$ corresponderá a strings que terminam com txt independentemente do ponto. Porque grep aceita expressão regular como parâmetro. Portanto, os arquivos a.txt e aatxt e a-txt serão todos correspondidos por esta expressão. A expressão correta deve ser ls | 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 teste ls | grep \\.txt$ | xargs --no-run-if-empty echo (observação: há ' s não -v sinalizador e rm=>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 executa echo 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") 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *