Переименуйте музыкальные файлы, чтобы они в алфавитном порядке следовали списку воспроизведения

У меня есть несколько 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

Адаптируйся и расширяй свои потребности!


Теперь давайте предположим, что вы играли с этим, и вы хотите отменить переименование... есть две возможности:

  1. У вас есть только файлы вида XXXX.YYYY где XXXX цифры, и вы хотите удалить цифры и точку из названия:

    shopt -s extglob
    for i in +([[:digit:]]).*; do
        target=${i#*.}
        echo mv -nv -- "$i" "$target"
    done
    

    и удалите echo когда ты счастлив.

  2. Вы хотите сделать это только для файлов в вашем плейлисте 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, и все, что мне нужно сделать, это выбрать файлы, которые я хотел бы переименовать, щелкнуть правой кнопкой мыши на выделении и...

введите описание изображения здесь

Надеюсь это поможет

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