Como posso excluir arquivos contendo um número '3' ou '2' em seu nome de arquivo?

5

No momento, estou tentando excluir alguns arquivos. Os arquivos que eu quero excluir contêm o número 3 ou 2, ambos ou um deles.

Como excluo arquivos que contêm esses números?

Os arquivos são nomeados assim:

K-0_0_1_1_1_1_1_0.wav
K-0_0_1_1_1_1_1_1.wav
K-0_1_0_0_0_0_0_0.wav
K-0_1_0_0_0_0_0_1.wav
K-0_1_0_0_0_0_1_0.wav
K-0_0_0_0_0_0_0_2.wav
K-0_0_0_0_0_0_0_3.wav
K-0_0_0_0_0_0_1_2.wav

Nesta lista, os últimos três arquivos devem ser excluídos.

    
por I am not Fat 23.08.2017 / 12:47

5 respostas

20

Para o diretório atual, você pode usar:

rm -- *[23]*

Se você quiser restringi-lo, para corresponder apenas aos arquivos em que o 2 ou 3 deve ocorrer entre K e .wav :

rm K*[23]*.wav

Se você quiser tornar isso mais seguro forçando rm a solicitar confirmação para cada arquivo, use o sinalizador -i interactive:

rm -i K*[23]*.wav

Notas

  • o shell glob * corresponde a qualquer número (incluindo zero) de quaisquer caracteres
  • para o shell [some chars] é uma classe de caractere - qualquer coisa dentro dela pode corresponder
  • -- é reconhecido por rm como o final das opções. Isso evita erros se algum nome de arquivo começar com - ; caso contrário, o nome do arquivo pode ser interpretado como uma opção

Se você precisar evitar a correspondência de 22 , 23 , 32 , 33 , precisará de algo um pouco mais complexo, como resposta da AFSHIN .

    
por Zanna 23.08.2017 / 12:51
8

Você pode usar globs de shell:

rm *2* *3*

Isso excluirá todos os arquivos (não diretórios) dentro do diretório de trabalho atual, que serão correspondidos por *2* ou *3* globs.

Nesses globs, " * sempre significa" qualquer número (incluindo zero) de qualquer caractere ".

Note, entretanto, que os globs do BRC do IIRC não correspondem aos arquivos ocultos (nome do arquivo começando com . ) por padrão.

    
por Byte Commander 23.08.2017 / 12:51
5

Para o diretório atual ou qualquer outro local:

  1. Execute isso para ver o que deve ser excluído:

    find . -type f -iname "*[32]*.wav" 
    
  2. Em seguida, exclua com:

    find . -type f -iname "*[32]*.wav" -delete
    

Mais informações:

  • . significa diretório atual, também pode ser o caminho para o local do arquivo, como /path/to/files
  • Para evitar que find seja movido para qualquer diretório no destino pretendido, use a opção -maxdepth 1 , portanto:
    • find . -maxdepth 1 -type f -iname "*[32]*.wav" -delete
  • Se no diretório de destino, use:
    • find . -maxdepth 1 -type f -iname "*[32]*.wav" -delete

CUIDADO

Nunca faça isso find . -delete -type f -iname "*[32]*.wav" else todos (seus arquivos) serão excluídos!

    
por George Udosen 23.08.2017 / 12:56
2

Embora as respostas fornecidas também excluam arquivos incluindo *23* , *32* , *2*3* , *3*2* , *2* ou *3* arquivos padrões + essa resposta com rm *2* *3* solution tentará excluir um arquivo K-0_0_0_0_3_0_1_2.wav duas vezes e a segunda tentativa falhará, pois foi excluída por *2* padrão correspondido!.

Para evitar isso, abaixo está um comando que só retorna arquivos incluindo 2 ou 3 ou ambos em seus nomes, somente repetidos uma vez.

find . -type f -name "*[^0-9][2|3][^0-9]*" #-delete

Ou em rm você pode usar o seguinte em seu lugar.

rm -- *[^0-9][23][^0-9]*
    
por αғsнιη 24.08.2017 / 03:16
0

Sou fã de xargs , o que permite uma pré-visualização antes de executar o comando:

$ echo *2* *3*
(list of files with 2 or 3 in name)

Isso é apenas o teste shell glob (funciona no bash), se a lista estiver correta, canalize-a para xargs:

$ echo *2* *3* | xargs rm -v

A opção -v lista os arquivos rm que estão sendo removidos. Você poderia ser mais paranóico e adicionar a opção -i com -v , de modo que ele solicite cada exclusão.

    
por brass 23.08.2017 / 21:10