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., pode conter espaços e símbolos como números, letras, [
, ]
, e (
, mas não números entre espaços. E , , etc, podem conter qualquer coisa. O número no nome do arquivo entre espaços não se repete por mesmo , , etc.)
'
extra1
extra2
filename1
filename2
O que eu quero é remover as coisas extras dos arquivos que o contêm. Ou seja, para ir filename20 15 extra100.ext
defilename20 15.ext
Além disso, preciso fazer um loop no conteúdo de um diretório, então também preciso diferenciar entre arquivos que têm coisas extras (e depois aplicar o método de renomeação) de arquivos que não têm.
É possível? Acabei de mudar do Windows para o Linux e tenho um script em lote para isso, mas não tenho ideia de como começar isso no bash.
Cumprimentos,
Use (perl) renomear. O comando é o seguinte:
NB, existem dois
rename
s normalmente fornecidos 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. Verifique se você está usando o último. (Você não menciona sua distro, mas no Arch, ela é fornecida pelo pacoteperl-rename
.)Teste primeiro
Crie os arquivos (adicionei um arquivo extra no final).
Teste o comando
Se você estiver satisfeito com os resultados, remova o sinalizador "dry-run"/test
-n
e execute-o de verdade.Explicação
rename 's/foo/bar/' *
: perl rename substituirá uma ocorrência da expressão regularfoo
porbar
. Isso atua em todos os arquivos*
no diretório atual. Você também pode substituir isso explicitamente*.ext
para limitar em quais arquivos ele atua./( [0-9]*) .*\.ext
: corresponde a um espaço seguido por uma sequência 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 reutilização posterior. Em seguida, combine tudo.*
até e incluindo a extensão\.ext
. Como esse regex é "ganancioso", ele tentará corresponder ao maior número possível de caracteres. ou seja, se houver dígitos cercados por espaços naextra
parte do nome do arquivo, eles serão correspondidos./$1.ext
Substitua esta parte correspondente pelo grupo de captura de cima$1
, ou seja, o espaço e os dígitos, seguidos pela extensão.ext
.