Переименование и очистка имен файлов телешоу на S01E01.mp4 и т. Д.

Хотя это выглядит просто, на самом деле это очень сложно.

Задания, запускаемые 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 довольно нестабилен, поэтому если вы найдете ошибки, пожалуйста, сообщите о них.

3
26.08.2016, 20:19
1 ответ

Используйте 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
3
27.01.2020, 21:21

Теги

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