AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 722840
Accepted
Sudoh
Sudoh
Asked: 2022-10-29 11:34:54 +0800 CST2022-10-29 11:34:54 +0800 CST 2022-10-29 11:34:54 +0800 CST

No Bash, como posso rm arquivos em um curinga enquanto forneço mais de uma exceção?

  • 772

Tenho a seguinte lista de arquivos:

main.acn
main.acr
main.alg
main.aux
main.glg
main.glo
main.gls
main.ist
main.lof
main.log
main.lot
main.nlo
Saída principal
main.pdf 
main.tex
main.toc

Eu quero rm todos os main.*arquivos, exceto o arquivo main.tex e main.pdf .

Eu tentei, rm main.* !("main.tex","main.pdf")mas isso não funcionou e removi todos os main.* sem exceção.

Alguma ideia?

bash
  • 4 4 respostas
  • 1113 Views

4 respostas

  • Voted
  1. Best Answer
    ilkkachu
    2022-10-29T11:44:27+08:002022-10-29T11:44:27+08:00

    !("main.tex","main.pdf")corresponde a qualquer coisa que não seja main.tex,main.pdf, então provavelmente todos os arquivos no diretório.

    A chave a notar é que !(...)já age como *, pois ele próprio corresponde a qualquer coisa que não seja uma das coisas dentro. E o separador é |, não ,.

    Então, main.!(tex|pdf)deve funcionar. Ou !(main.tex|main.pdf)se você deseja remover todos os arquivos, exceto esses dois, não apenas aqueles com nomes que começam com main..

    Ver:

    • https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html
    • https://mywiki.wooledge.org/glob#extglob
    • 19
  2. roaima
    2022-10-29T14:52:10+08:002022-10-29T14:52:10+08:00

    A rota menos sofisticada é salvar os arquivos que você deseja manter, excluir tudo (o resto) e colocar os arquivos salvos novamente. É também uma solução compatível com POSIX:

    mkdir x                   # File or directory must not already exist
    mv main.tex main.pdf x    # Save the files you want to keep
    rm ./*                    # Ignore the error about not deleting 'x'
    mv x/* .                  # Restore everything you saved. Notice the dot!
    rmdir x                   # Tidy up
    

    Aqui eu escolhi xcomo um arquivo ou diretório que ainda não existe. Você receberá um erro rmque não pode ser excluído x; isso é bom. Não use rm -rf!

    Observe que normalmente rm ./*irá pular arquivos de ponto.

    • 9
  3. Sotto Voce
    2022-10-29T13:10:52+08:002022-10-29T13:10:52+08:00

    No Bash também existe a GLOBIGNOREvariável, que pode excluir/remover nomes da lista retornada por um glob. Um exemplo:

    $ touch main.pdf main.tex one.pdf one.tex three.wow two.pdf two.tex
    $ echo *
    main.pdf main.tex one.pdf one.tex three.wow two.pdf two.tex
    $ GLOBIGNORE='main.tex:main.pdf'
    $ echo *
    one.pdf one.tex three.wow two.pdf two.tex
    

    GLOBIGNOREpode ser uma lista de expressões (separadas por dois pontos) que descrevem os nomes a serem ignorados, como mostra o exemplo acima. Sua pergunta era sobre a exclusão de um par de nomes de arquivos simples, mas você também pode usar expressões glob:

    $ GLOBIGNORE='one.*:two.*'
    $ echo *
    main.pdf main.tex three.wow
    

    A lista de nomes correspondentes ao glob ( *nestes exemplos) é avaliada em relação às expressões em GLOBIGNORE. Os nomes que correspondem a qualquer uma das expressões são removidos da lista. É um recurso útil.

    Em muitos casos, também é útil usar export, como em export GLOBIGNORE='main.tex:main.pdf'.

    • 6
  4. jmf7
    2022-11-04T13:23:38+08:002022-11-04T13:23:38+08:00

    Sempre que me deparo com uma situação como essa, faço isso com um pipe:

    ls -1 main.* | egrep -v '\.pdf|\.tex' | xargs rm

    • 0

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve