Переименуйте музыкальные файлы с Недостающими расширениями файла

Я испытывал несколько различных аудиоплееров недавно и заметил, что некоторые (большая) моя музыка будут отсутствовать в библиотеке. Оказывается, что в какой-то момент, множество моих музыкальных файлов потеряло их .mp3/.ogg/.flac расширения файла. Я честно не уверен, как это произошло, но я уверен, что это было что-то, что я сделал по ошибке (или возможно я думал, что это не будет иметь значения, так как расширения файла являются главным образом косметическими так или иначе).

Таким образом, я должен вернуть эти расширения файла. Я изучил pyrenamer, но я не могу выяснить, как соответствовать ему в файлы без расширения и затем сказать ему добавлять корректное расширение файла в зависимости от фактического типа файла.

Я также посмотрел на EasyTag. Однако это также распознает музыкальные файлы, базирующиеся полностью на их расширениях файла. Таким образом, музыка, которую я хочу зафиксировать, даже не обнаруживается.Замечательно.

Какие-либо мысли о том, как сделать это? Я, конечно, не возражаю против некоторой командной строки, я просто не уверен, какие инструменты были бы лучшими, и я также сосу в regex.

3
задан 15 October 2010 в 02:57

2 ответа

Этот сценарий bash может помочь:

#! /bin/bash

find ~/Music -type f | (while read path; do
    case `file -i "$path"` in
        *audio/mp3*|*audio/mpeg*) ext='.mp3' ;;
        *application/ogg*) ext='.ogg' ;;
        *flac*) ext='.flac' ;;
        *) continue;; # ignore unknown files
    esac

    newname="$(dirname "$path")/$(basename "$path" "$ext").$ext"
    if [ "$path" != "$newname" ]; then
        mv -v "$path" "$newname"
    fi
done)

Скрипт использует file -i для чтения MIME-типа файла; У меня нет файлов FLAC, поэтому вы можете проверить, какой тип MIME для FLAC, запустив file -i a_file.flac (и, возможно, настроить источник скрипта).

Вы можете добавить опцию -i в mv, если вы хотите запросить подтверждение перед переименованием любого файла.

Возможно, было бы неплохо заменить mv -v на echo mv -v и выполнить тестовый прогон перед попыткой фактического переименования. исполняться по сценарию.

0
ответ дан 15 October 2010 в 02:57

Вот скрипт bash, который переименовывает файлы, переданные ему, в соответствии с их предполагаемым форматом. Он вызывает file , чтобы выяснить формат, глядя на характерные паттерны в первых нескольких байтах. file -i печатает строки наподобие /path/to/file: type/subtype, где type/subtype - это тип MIME . Затем скрипт связывает расширения с известными типами и переименовывает файл, чтобы иметь расширение. Файлы, которые уже имеют расширение, остаются одни. Файлы с нераспознанным типом остаются одни. Скрипт выдаст запрос перед перезаписью целевого файла.

#!/bin/bash
# usage:
# fixmime ./{**/,}*
file --mime-type "$@" |
while read -r line; do
  file=${line%:*}
  type=${line##* }
  case $type in

    #Audio
    audio/x-flac) ext=flac;;
    audio/mpeg) ext=mp3;;
    application/ogg) ext=ogg;;

    #Video
    video/mp4) ext=mp4;;
    video/x-flv) ext=flv;;
    application/octet-stream) ext=webm;;
    application/x-shockwave-flash) ext=swf;;

    #Images
    image/png) ext=png;;
    image/jpeg) ext=jpg;;
    image/gif) ext=gif;;
    image/x-ico) ext=ico;;

    #Text
    text/plain) ext=md;; #markup your notes, even when they are plain
    text/html) ext=html;;
    text/x-pascal) ext=py;;
    text/x-c++) ext=js;; #conflicts with .cpp, so use prefered
    text/x-c) ext=scss;; #usualy it is .c
    text/x-shellscript) ext=sh;;
    application/pdf) ext=pdf;;

    #Fonts
    application/x-font-ttf) ext=ttf;;
    application/vnd.ms-opentype) ext=otf;;

    #Archive
    application/x-gzip) ext=tar.gz;;
    application/x-bzip2) ext=tar.bz;;

    *) continue;;
  esac
  [[ $file = *.$ext ]] || mv -i -- "$file" "$file.$ext"
done

Сохраните скрипт как ~/bin/rename-based-on-content-type (или как хотите) и сделайте его исполняемым (chmod +x ~/bin/rename-based-on-content-type). Передайте имена файлов, которые вы хотите переименовать, в сценарий в командной строке. Если у вас есть дерево каталогов /path/to/music/directory, которое вы хотите рекурсивно обходить, вызовите скрипт как

~/bin/rename-based-on-content-type /path/to/music/directory/{**/,}*
0
ответ дан 15 October 2010 в 02:57

Другие вопросы по тегам:

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