Получение неожиданного вывода от переименовывает команду

Я имею 1000 + изображения, и я должен переименовать их всех так, я сначала тестировал свою команду на 20 изображениях. Их называют как

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

Я хочу переименовать их как

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

Таким образом, я использовал эту команду

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

Но мой вывод неожидан. Вывод:

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

Таким образом, где я иду не так, как надо?

0
задан 26 March 2018 в 15:46

1 ответ

Не смешивайте оболочку, и код Perl в переименовывают команду; это - все о Perl. Используйте это:

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

Удалить -n переключитесь, когда вывод будет выглядеть хорошим.


Если Вы настаиваете для использования грязного пути, не используйте шарик * но текущий файл и современная оболочка:

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

Я удалил expr, это устарело.


warning Существуют другие инструменты с тем же именем, которое может или не мочь сделать это, так быть осторожным.

Если Вы выполняете следующую команду

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

и у Вас есть результат, который содержит Perl script, ASCII text executable, и не содержащий ELF, затем это, кажется, правильный инструмент =)

В противном случае обычно уже сделать это значением по умолчанию (случай):

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

Замена /path/to/rename с путем Вашего Perl rename исполняемый файл.


Если Вы не имеете этой команды, ищете Ваш диспетчер пакетов, чтобы установить его или сделать это вручную (никакой deps...)

1
ответ дан 30 October 2019 в 04:42

Другие вопросы по тегам:

Похожие вопросы: