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 regularfoo
withbar
. 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 parteextra
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
.