2

Я пытаюсь переместить файлы в подпапки на основе регулярного выражения. Например, я пытаюсь переместить ТВ-шоу в правильную папку шоу и сезона. Все файлы следуют шаблону «Показать имя».S00E00.episode title.avi ".

Я посмотрел на mmv и переименовал, но не могу найти никаких полезных примеров.

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

Изменить: я забыл упомянуть структуру папок

./
   Unsorted video files 
   Show Name/
      Season 1/
           Video Files Sorted
      Season 2/

2 ответа2

3

Для оболочки bash :

for file in *.avi; do
    # use perl to transform the file name; could use 'sed -r' too
    new_path=$(perl -pe 's|^(.+?)\.S0*(\d+)E0*(\d+)\.(.+)\.(\w+)$|$1/Season $2/Episode $3 - $4.$5|' <<< "$file")
    # create directories if needed
    mkdir -p "${new_path%/*}"
    # move the file
    mv -vn "$file" "$new_path"
done

В этом примере регулярного выражения (s|...|...|):

  • $1 - это название шоу (все до " .S<num>E<num> ");
  • $2 и $3 - номера сезона / эпизода;
  • $4 - заголовок эпизода (все до финального « . »);
  • $5 - это расширение файла.

Если вы хотите сохранить ведущие нули в числах сезона / эпизода, замените S0* и E0* просто S и E Если вы хотите обрабатывать файлы других типов, настройте *.avi в первой строке.


Debian и Ubuntu поставляются со скриптом prename основе Perl, который можно использовать для этого, но он не создает новые каталоги автоматически. Это легко изменить, чтобы сделать это ; тогда вы можете просто использовать prename 'the above regexp' *.avi .)

0

Или вы можете использовать только команды bash (если все ваши файлы действительно соответствуют предоставленной вами структуре):

for episode in *avi ; do
  ### cut $episode into fields, separated by "." and assign the first such field to $showname
  ### assign the second and third character of the second field to $season
  showname=`echo $episode | cut -d "." -f1`
  season=`echo $episode | cut -d "." -f2 | cut -c 2,3`
  ### create directory only if not already created
  mkdir -p $showname/$season
  ### move the file
  mv $episode $showname/$season/
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .