Я имею 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
Таким образом, где я иду не так, как надо?
Не смешивайте оболочку, и код 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
, это устарело.
Существуют другие инструменты с тем же именем, которое может или не мочь сделать это, так быть осторожным.
Если Вы выполняете следующую команду
$ 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...)