Сохраните все музыкальные файлы в VLC xspf плей-лист к другой папке

У меня есть плей-лист VLC (.xspf) по 100 песни все рассеянные на всем протяжении моего компьютера. Я ищу способ сохранить этот плей-лист и все, что это - песни к другой папке - флеш-накопитель, внешний диск или просто другое местоположение в моем компьютере. Как я могу сделать это?

Править

xspf плей-лист находится в XML и является таким форматом:

<?xml version="1.0" encoding="UTF-8"?>
<playlist xmlns="http://xspf.org/ns/0/" xmlns:vlc="http://www.videolan.org/vlc/playlist/ns/0/" version="1">
    <title>Playlist</title>
    <trackList>
        <track>
            <location>file:///home/subroot/Music/3%20Days%20Grace%20-%20Wake%20Up.mp3</location>
            <title>Wake Up</title>
            <creator>3 Days Grace</creator>
            <album>Three Days Grace</album>
            <trackNum>10</trackNum>
            <annotation> </annotation>
            <duration>206036</duration>
            <extension application="http://www.videolan.org/vlc/playlist/0">
                <vlc:id>0</vlc:id>
            </extension>
        </track>
        .
        . [Many more tracks here]
        .
    </trackList>
    <extension application="http://www.videolan.org/vlc/playlist/0">
            <vlc:item tid="0"/>
            .
            . [Other id's here]
            .
    </extension>
</playlist>
3
задан 12 January 2017 в 08:38

1 ответ

Это должно сделать это, предположив, что ни одни из Ваших имен файлов не содержат <:

grep -Po 'file://\K[^<]+' now.xspf | while IFS= read -r file; do
    song="${file//%20/ }"
    cp "$song" /path/to/target;
done

Объяснение

-o флаг говорит grep только распечатать подобранную часть строки и -P активирует Perl Совместимые Регулярные выражения, которые дают нам \K. \K причины grep для отбрасывания всего подобранного перед ним так, результат - это file://\K[^<]+ будет соответствовать самой длинной строке не -< символы, которые прибывают после file://.

Это затем питается к некоторое время циклу с IFS= выключить разделение слова в пробеле и -r рассматривать обратные косые черты как обычные символы.

Строка SONG="${file//%20/ }" преобразовывает все %20 кому: (вакуум). Иначе это возвращает 'путь, не найденный' ошибка, когда это пытается скопировать песни в последней строке.

Если Ваши имена файлов могут содержать <, используйте это вместо этого:

perl -lne '@foo=(m#file://(.+?)</location>#g); END{print $_ for @foo}' playlist.xspf |
while IFS= read -r file; do
    cp "$file" /path/to/target/;
done

Примечание: Оба решения предполагают, что ни одни из Ваших имен файлов не содержат новые строки.

2
ответ дан 1 December 2019 в 17:06

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

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