переименуйте скрипт для настройки определенных шаблонов в имени файла в debian

#regex #linux #bash #rename

Вопрос:

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

  1. Удалите «S00″ — » S99 » — эта часть должна быть вырезана из имени файла. s/[sS](0[1-9]|[1-9][0-9])/ я думаю, что мог бы это сделать
  2. Перед любыми свободно стоящими двузначными цифрами ставится буква «Е». Найти /b([0-9]{2})b/ и E$1 как-то заменить

Пример: любой из этих

  • [lorem ipsum] долор сит амет 07 [консетур][1080p].mkv
  • [lorem ipsum] долор сит амет S04 07 [consetetur][1080p].mkv
  • [lorem ipsum] долор сит амет S04 E07 [consetetur][1080p].mkv

изменяются на

  • [lorem ipsum] долор сит амет E07 [consetetur][1080p].mkv

в их соответствующих подпапках.

Конечная цель состоит в том, чтобы автоматизировать процесс переименования файлов по мере их появления (этот последний бит я должен выяснить, как только закончу с этим), чтобы скребок коди мог распознавать эпизоды

Вот как далеко я зашел, как вы можете видеть, это все еще беспорядок, так как я нашел этот скрипт переименования здесь некоторое время назад, но я не знаю, как правильно применить регулярное выражение, я просто вставил его

 #!/bin/bash

start_dir="//srv/MEDIA2/"
find "$start_dir" -name '*.*' -type f 
  |sort 
  |while read name; do 
     ((i  ))
     mv -i "$name" 
#remove season part
       "$(printf 's/[sS](0[1-9]|[1-9][0-9])/' "$(dirname "$name")" $((i)) "$(basename "$name")")"
#prepend E to free standing double digits
       "$(printf 's/b([0-9]{2})b/' "$(dirname "$name")" $((i)) "$(basename "$name")")"
    
done
 

В настоящее время он возвращается

 //home/user/./rnscript.sh: line 14: s/[sS](0[1-9]|[1-9][0-9])/: No such file or directory
//home/user/./rnscript.sh: line 16: s([0-9]{2}/: No such file or directory
 

Если бы кто-нибудь, обладающий знаниями в этой области, мог помочь мне в этом, я был бы очень признателен.

Комментарии:

1. Какова цель инкрементной переменной $i ?

2. Сначала я думал, что он должен был продолжать работать после переименования, пока он не проверит все файлы таким образом. но теперь я понимаю, что это пережиток другого сценария, который был разработан, чтобы добавить количество чисел к имени. Ааа, карп, ладно, это еще больший беспорядок, чем я думал

Ответ №1:

Не могли бы вы, пожалуйста, попробовать следующее:

 #!/bin/bash

shopt -s globstar

start_dir="//srv/MEDIA2/"                       # double // may be meaningless
for name in "$start_dir"/**/*.*; do             # search the directory recursively
    [[ -f $name ]] || continue                  # skip if "$name" is not a file
    newname=$(sed -E 's/[sS](0[1-9]|[1-9][0-9])  //; s/b([0-9]{2})b/E1/' <<< "$name")
    if [[ "$name" != "$newname" ]]; then        # skip if the filenames are the same
         echo mv -- "$name" "$newname"
    fi
done
 

Отбросьте echo , если результат выглядит хорошо.
Нам не нужно сортировать файлы, так как переменная $i не используется.

[ПРАВИТЬ]

Если вы S04E02 также хотите изменить E02 на, пожалуйста, замените newname= строку выше на:

 newname=$(sed -E 's/[sS](0[1-9]|[1-9][0-9]) *//; s/b([0-9]{2})b/E1/' <<< "$name")
 

Разница заключается в том , что просто измените значение на * , что означает ноль или более пробелов.

Комментарии:

1. оооо, это действительно работает!!! большое вам спасибо! он возвращает это для каждого пропущенного файла, но я не возражаю против этого. mv: '//srv/MEDIA2/dateien2//youtube-icon.png' and '//srv/MEDIA2/dateien2//youtube-icon.png' are the same file

2. хорошо, одна проблема, похоже, не удается увидеть вложенные папки с пробелами в их названии, возможно ли это?

3. Спасибо вам за обратную связь. Можете ли вы уточнить имена путей, которые вызывают проблему? Я исправлю проблему с «одним и тем же файлом» за один раз.

4. Проверено еще раз, я думаю, что он проверяет только саму связанную папку, но никаких вложенных папок.

5. Я обновил свой ответ кодом, который будет поддерживать S04E02 тип выражения.