renomeia um arquivo removendo parte do nome do arquivo bash script

0

Eu tenho alguns arquivos no formulário:

filename1 1 extra1.ext
filename1 2.ext
filename1 3 extra2.ext
...
filename2 1.ext
filename2 100 extra3.ext
...
filename20 1.ext
filename20 15 extra100.ext
(etc.)

... onde filename1 , filename2 , etc., podem conter espaços e símbolos como números, letras, [ , ] , ( , ) e ' , mas não números colocados em espaços. E extra1 , extra2 , etc, pode conter qualquer coisa. O número no nome do arquivo delimitado por espaços não é repetido pelo mesmo filename1 , filename2 , etc.

O que eu quero é remover as coisas extras dos arquivos que o contêm. Ou seja, para ir de filename20 15 extra100.ext a filename20 15.ext

Além disso, eu preciso fazer um loop no conteúdo de um diretório, então eu também preciso diferenciar entre arquivos que possuem coisas extras (e então aplicam o método rename) de arquivos que não possuem.

É possível? Acabei de me mudar do Windows para o Linux, e eu tenho um script em lote para isso, mas eu não tenho idéia de como começar isso no bash.

Atenciosamente,

    
por kurokirasama 04.07.2018 / 03:18

1 resposta

2

Use (perl) renomear. O comando é o seguinte:

rename 's/( [0-9]*) .*\.ext/$1.ext/' *

N.B. há dois rename s geralmente enviados com distribuições Linux. O padrão é geralmente a versão mais simples. A renomeação baseada em perl é muito mais poderosa, porque dá acesso a expressões regulares. Certifique-se de estar usando o último. (Você não menciona sua distro, mas no Arch, ela é fornecida pelo pacote perl-rename .)

Teste primeiro

Crie os arquivos (adicionei um arquivo extra no final).

$ touch 'filename1 1 extra1.ext' 'filename1 2.ext' 'filename1 3 extra2.ext' 'filename2 1.ext' 'filename2 100 extra3.ext' 'filename20 1.ext' 'filename20 15 extra100.ext' 'filename3 1 3 4 .ext'

Teste o comando

$ rename 's/( [0-9]*) .*\.ext/$1.ext/' * -n
filename1 1 extra1.ext -> filename1 1.ext
filename1 3 extra2.ext -> filename1 3.ext
filename20 15 extra100.ext -> filename20 15.ext
filename2 100 extra3.ext -> filename2 100.ext
filename3 1 3 4 .ext -> filename3 1.ext

Se você estiver satisfeito com os resultados, remova o sinalizador "dry-run" / teste -n e execute-o para valer.

Explicação

  • rename 's/foo/bar/' * : renomear perl substituirá uma ocorrência da expressão regular foo with bar . Isso atua em todos os arquivos * no diretório atual. Você também pode explicitamente substituir isso por *.ext para limitar quais arquivos ele atua.
  • /( [0-9]*) .*\.ext : corresponde um espaço seguido por uma execução de dígitos [0-9]* seguido por outro espaço. Coloque o primeiro espaço e os dígitos em um grupo de captura ( [0-9]*) , para reutilizar mais tarde. Em seguida, combine tudo .* até e incluindo a extensão \.ext . Como esse regex é "ganancioso", ele tentará corresponder o maior número de caracteres possível. ou seja, se houver dígitos cercados por espaços na parte extra do nome do arquivo, eles serão correspondentes.
  • /$1.ext Substitua essa parte correspondente pelo grupo de captura acima de $1 , ou seja, o espaço e os dígitos, seguidos pela extensão .ext .
por 04.07.2018 / 03:27