Оставьте нераспределенное пространство в случае увеличения размера раздела в будущем?

Предполагая, что у вас есть файл 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, когда будете счастливы.
1
задан 8 March 2015 в 23:27

0 ответов

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

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