Eu tenho um diretório que contém arquivos de imagem com nomes como
image1.jpg
image2.jpg
image3.jpg
...
Infelizmente, os nomes das imagens devem ser baseados em zero, como image1.jpg
deveriam image0.jpg
, image2.jpg
devem ser image1.jpg
e assim por diante.
Posso escrever um script para gerar comandos mv como esses, colocá-los em um script shell e depois executá-los -
mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...
Mas suponho que exista uma maneira mais clara de fazer isso no Unix. Então o que é?
command-line
rename
Wes
fonte
fonte
for i in $(seq 0 100); do mv image$[i+1].jpg image$i.jpg; done
)imageN.jpg
paraimage0.jpg
e pronto.Respostas:
O bom e velho perl renomear:
[Observações]
Os números da imagem devem ser maiores que 0.
Caso as imagens sejam maiores que 9 e não tenham 0s à esquerda, use
$(ls -v1 *)
para evitar estroboscópios. Proposta por @arielf e notada por @Graeme.Em caso de dúvida, use também
-v
para verboso e-n
sem ação.fonte
perlreref
0
nas fontes.*
no final por`ls -v1 *`
e você estará mais seguro de bater. Vai do número mais baixo para o mais alto.Você pode canalizar os
mv
comandos gerados parabash
. Portanto, você não precisa copiá-los em um script e executá-lo. Vejo:E tudo será executado conforme o canal
bash
.fonte
:)
Resolve o problema, então +1.Você pode iterar na saída ls, esta funciona no seu exemplo:
Você deve estar no mesmo caminho dos seus arquivos
fonte
-i
ou-n
commv
, evitará a substituição em casos extremos.sort -V
seria melhor?sort
não funcionará, será exibidoimage10.jpg
antes doimage1.jpg
que pode ser um problema. Você precisasort -nk 1.8
como na resposta de @ Graeme.sort -V
é uma boa ideia, irá adicioná-lo à minha resposta. Porém, pode haver outros casos extremos, apenas bons conselhos para adicionar esse tipo de opções com perguntas como essa, caso alguém copie e acabe causando algum dano.A seguir, parece funcionar para qualquer coisa que se encaixe no padrão
imageNUMBER.jpg
. Coloqueiecho
antes domv
comando para mostrar primeiro o que o comando faria; para realmente executar a renomeação, basta remover oecho
Na primeira linha, isso
ls image*.jpg|sort -V
fará com que os arquivos JPG sejam listados com números crescentes no nome do arquivo. Ax=
linha extrai o número do nome do arquivo. Ay=
linha então diminui o número em um. O nome do arquivo de entrada e oy
número são usados nomv
comando, onde o-i
sinalizador notificará você antes de substituir um arquivo.Para meu pequeno teste, isso produziu a saída:
Pessoalmente, sugiro renomear para um nome de arquivo mais diferente, pois agora a ordem na qual os arquivos são processados pode fazer uma grande diferença.
fonte
-i
ou-n
commv
, evitará a substituição em casos extremos.sort -n
, a-V
opção não existe.O uso do
perl
scriptprename
, que tem o link simbólico para renomear nas distribuições baseadas no Debian, também precisa do GNUfind
/sort
. Os arquivos são colocados em ordem crescente para evitar qualquer substituição.Remova a
-n
vez que tiver certeza de que faz o que deseja. Irá avisar sobre arquivos já existentes antes de fazê-lo. No entanto, desde que mostre os arquivos sendo renomeados em ordem crescente, não haverá conflitos quando executados de verdade.fonte
Com
zsh
:(remova
-n
quando estiver feliz).(n)
é classificar a lista numericamente eimage9.jpg
renomear antesimage10.jpg
.fonte