#regex #linux #bash #rename
Вопрос:
В настоящее время я немного застрял, пытаясь настроить имена файлов в дереве папок, если у них есть одно или оба из следующих:
- Удалите «S00″ — » S99 » — эта часть должна быть вырезана из имени файла.
s/[sS](0[1-9]|[1-9][0-9])/
я думаю, что мог бы это сделать - Перед любыми свободно стоящими двузначными цифрами ставится буква «Е». Найти
/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
тип выражения.