Хотя это выглядит просто, на самом деле это очень сложно.
Задания, запускаемые GNU Parallel, не запускаются внутри той же оболочки, из которой запускается GNU Parallel. Поэтому это выглядит так:
bash[1]---perl(running parallel)---bash[2]
$array определен в bash[1], но вы хотите использовать его в bash[2]. Это невозможно сделать полностью (т.е. если вы хотите получить доступ на запись к массиву), но мы можем сделать копию $array доступной:
env_parallel 'echo ${array[{}]}' ::: 1 2
env_parallel
(введено в GNU Parallel 20140822) копирует все окружение bash[1] в bash[2] (так что ваше окружение должно быть вроде как небольшим), где оно инициируется перед запуском задания.
env_parallel
довольно нестабилен, поэтому если вы найдете ошибки, пожалуйста, сообщите о них.
Используйте printf
со строкой формата, которая определяет ширину поля и заполнение нулями для целых чисел, например
printf -v newname 'S%02dE%02d%s' "$((10#${BASH_REMATCH[2]}))" "$((10#${BASH_REMATCH[3]}))" "${BASH_REMATCH[4]}"
Обратите внимание на использование $ ((10 # $ {BASH_REMATCH [n]}))
для принудительного вычисления десятичной дроби в таких случаях, как 09
Тестирование (я немного изменил ваше регулярное выражение BTW ):
reg='^([^0-9]*)([0-9][0-9]*)[^0-9]*([0-9][0-9]*)(\....)$'
for filename in *.mp4; do
if [[ $filename =~ $reg ]]; then
printf -v newname 'S%02dE%02d%s' "$((10#${BASH_REMATCH[2]}))" "$((10#${BASH_REMATCH[3]}))" "${BASH_REMATCH[4]}"
echo mv "$filename" "$newname"
fi
done
mv Some Series01.Episode02.mp4 S01E02.mp4
mv SomeSeries1Episode03.mp4 S01E03.mp4
mv Some_Series.1_Episode.1.mp4 S01E01.mp4
Возможно, более надежным было бы использовать регулярное выражение только для сопоставления первых двух последовательностей цифр и использовать подстановку параметров оболочки для обработки расширения:
reg='([0-9][0-9]*)[^0-9]*([0-9][0-9]*)'
for filename in *.mp4 *.mkv; do
name="${filename%.*}"
ext="${filename##*.}"
if [[ $name =~ $reg ]]; then
printf -v newname 'S%02dE%02d.%s' "$((10#${BASH_REMATCH[1]}))" "$((10#${BASH_REMATCH[2]}))" "${ext}"
echo mv "$filename" "$newname"
fi
done
mv Some Series01.Episode02.mp4 S01E02.mp4
mv SomeSeries09Episode10.mp4 S09E10.mp4
mv SomeSeries1Episode03.mp4 S01E03.mp4
mv Some_Series.1_Episode.1.mp4 S01E01.mp4
mv Breaking.Bad.S01E01.576p.BluRay.DD5.1.x264-HiSD.mkv S01E01.mkv
В качестве альтернативы, если в вашей системе есть на основе perl переименовать
/ prename
команду, вы могли бы что-то вроде
prename -vn -- 's/.*(\d+).*(\d+)/sprintf "S%02dE%02d.mp4", $1, $2/e' *.mp4