Obtendo resultados inesperados do comando rename

0

Eu tenho mais de 1000 imagens e tenho que renomeá-las, então testei meu comando em 20 imagens. Eles são nomeados como

cropped1.jpg cropped2.jpg cropped3.jpg ... cropped20.jpg

Quero renomeá-los como

21.jpg 22.jpg 23.jpg ... 40.jpg

Então eu estava usando este comando

for i in {1..20}; do rename "s/"cropped"$i/$(expr $i + 20)/" * ; done

Mas minha saída é inesperada. A saída é:

210.jpg  212.jpg  214.jpg  216.jpg  218.jpg  21.jpg   22.jpg  24.jpg  26.jpg  28.jpg 211.jpg  213.jpg  215.jpg  217.jpg  219.jpg  220.jpg  23.jpg  25.jpg  27.jpg  29.jpg

Então, onde estou indo errado?

    
por Ujjwal Gupta 26.03.2018 / 22:54

1 resposta

1

Não misture shell e código Perl no comando rename; É tudo sobre Perl. Use isto:

rename -n 's/cropped(\d+)/$1 + 20/e' cropped*.jpg

Remova o interruptor -n quando a saída estiver boa.

Se você insistir em usar o seu caminho sujo, não use o glob * , mas o arquivo atual e o shell moderno:

for i in {1..20}; do
    test -s "cropped$i.jpg" && rename "s/cropped$i/$(($i + 20))/" "cropped$i.jpg"
done

Eu removi expr , está desatualizado .

Existemoutrasferramentascomomesmonomequepodemounãosercapazesdefazerissoentãotenhacuidado.

Sevocêexecutaroseguintecomando

$file"$(readlink -f "$(type -p rename)")"

e você tem um resultado que contém Perl script, ASCII text executable e não contém ELF , então esta parece ser a ferramenta certa =)

Se não, para torná-lo o padrão (geralmente já é o caso):

$ sudo update-alternatives --set rename /path/to/rename

Substitua /path/to/rename pelo caminho do seu executável Perl rename .

Se você não tiver esse comando, pesquise seu gerenciador de pacotes para instalá-lo ou faça isso manualmente (não há deps ...)

    
por Gilles Quenot 26.03.2018 / 23:39