Переименуйте музыкальные файлы, чтобы они в алфавитном порядке следовали списку воспроизведения
У меня есть несколько mp3, которые я организовал в плейлист для вечеринки. Я хотел бы легко переименовать эти файлы, чтобы они начинались с позиции в списке воспроизведения:
001.Track.mp3
002.Track.mp3
.
.
.
Тогда они могут быть просто воспроизведены в алфавитном порядке. Это возможно, не делая это вручную?
3 ответа
Вы можете попробовать что-то вроде этого: я не уверен, что нужно что-то большее, но это должно сработать.
cat playlist.m3u | I=1 while read file; do
mv $file $I.$file.mp3;
I=$I + 1;
done;
Редактировать: вам может понадобиться I=`expr $I + 1'; вместо I=$I + 1;
Если у вас есть файл my_playlist.txt
который содержит дорожки в том порядке, в котором вы хотите их воспроизвести, например,
dancing all night long.mp3
charles trenet - je t'aime mon amour.mp3
mon petit poney - bo.mp3
charlie parker - donna lee.flac
и предполагая, что этот файл находится в той же директории, где находятся ваши музыкальные файлы. Если это не так, пожалуйста, укажите свой вопрос соответственно.
Затем (обратите внимание на хорошую практику bash, которая будет работать с именами файлов, в которых есть пробелы):
#!/bin/bash
pl=my_playlist.txt
# need number of files, to know the number of leading zeros
n=$(wc -l < "$pl")
lz=0
while ((n)); do ((++lz)); ((n/=10)); done
i=1
while read f; do
[[ -z $f ]] && continue
if [[ ! -f $f ]]; then
printf "*** Error, file \`%s' not found.\n" "$f"
continue
fi
printf -v target "%0*d.%s" "$lz" "$i" "$f"
echo mv -vn -- "$f" "$target"
((++i))
done < "$pl"
Если вы запустите его как есть, переименования не произойдет, потому что echo
перед mv
, Это всего лишь маленький тест. Когда вы довольны этим, удалите echo
и переименование состоится. mv
команда имеет два флага -v
а также -n
:
-v
: быть многословным (мне нравится знать, что происходит)-n
: нет clobber, чтобы не перезаписывать существующие файлы (безопаснее)
Примечание о printf
командование Это выглядит немного уродливо, но бояться нечего. Часть %0*d
приму два аргумента $lz
а также $i
и будет заменен на номер $i
с $lz
ведущие нули. Тогда %s
будет заменен третьим аргументом, который является именем файла. Все это будет помещено в переменную target
, благодаря -v
вариант. Чтобы target
будет что-то вроде:
0001.title of the file.mp3
Адаптируйся и расширяй свои потребности!
Теперь давайте предположим, что вы играли с этим, и вы хотите отменить переименование... есть две возможности:
У вас есть только файлы вида
XXXX.YYYY
гдеXXXX
цифры, и вы хотите удалить цифры и точку из названия:shopt -s extglob for i in +([[:digit:]]).*; do target=${i#*.} echo mv -nv -- "$i" "$target" done
и удалите
echo
когда ты счастлив.Вы хотите сделать это только для файлов в вашем плейлисте
my_playlist.txt
:shopt -s extglob while read f; do a=( +([[:digit:]])."$f" ) if ((${#a[@]}==0)); then printf "*** Error: can't find a match for file \`%s'\n" "$f" elif ((${#a[@]}>1)); then printf "*** Error: found several matches for file \`%s':\n" "$f" printf " %s\n" "${a[@]}" else target=${a[0]#*.} echo mv -nv -- "$f" "$target" fi done < my_playlist.txt
и как обычно удалите
echo
когда ты счастлив.
Я использую Dolphin, замену Nautilus, и все, что мне нужно сделать, это выбрать файлы, которые я хотел бы переименовать, щелкнуть правой кнопкой мыши на выделении и...
Надеюсь это поможет