Предполагая, что у вас есть файл 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"
If вы запускаете его как есть, переименования не произойдет, из-за 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
Адаптироваться и расширить ваши потребности!
Теперь предположим, что вы играли с что, и вы хотите Обратите внимание на команду printf переименование ... есть две возможности:
У вас есть только файлы формы XXXX.YYYY, где - цифры, и вы хотите удалить цифры и период с имени: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, когда будете счастливы.