Я испытывал несколько различных аудиоплееров недавно и заметил, что некоторые (большая) моя музыка будут отсутствовать в библиотеке. Оказывается, что в какой-то момент, множество моих музыкальных файлов потеряло их .mp3/.ogg/.flac расширения файла. Я честно не уверен, как это произошло, но я уверен, что это было что-то, что я сделал по ошибке (или возможно я думал, что это не будет иметь значения, так как расширения файла являются главным образом косметическими так или иначе).
Таким образом, я должен вернуть эти расширения файла. Я изучил pyrenamer, но я не могу выяснить, как соответствовать ему в файлы без расширения и затем сказать ему добавлять корректное расширение файла в зависимости от фактического типа файла.
Я также посмотрел на EasyTag. Однако это также распознает музыкальные файлы, базирующиеся полностью на их расширениях файла. Таким образом, музыка, которую я хочу зафиксировать, даже не обнаруживается.Замечательно.
Какие-либо мысли о том, как сделать это? Я, конечно, не возражаю против некоторой командной строки, я просто не уверен, какие инструменты были бы лучшими, и я также сосу в regex.
Этот сценарий 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
и выполнить тестовый прогон перед попыткой фактического переименования. исполняться по сценарию.
Вот скрипт 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/{**/,}*