it-swarm.com.de

Speichern Sie alle Musikdateien in einer VLC xspf-Wiedergabeliste in einem anderen Ordner

Ich habe eine VLC-Wiedergabeliste (.xspf) mit über 100 Titeln, die alle auf meinem Computer verteilt sind. Ich suche nach einer Möglichkeit, diese Wiedergabeliste und alle darin enthaltenen Titel in einem anderen Ordner zu speichern - auf einem Flash-Laufwerk, einem externen Laufwerk oder an einem anderen Ort auf meinem Computer. Wie kann ich das machen?

EDIT

Die xspf-Wiedergabeliste ist in XML und hat ein solches Format:

<?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
Parto

Dies sollte unter der Annahme geschehen, dass keiner Ihrer Dateinamen _<_ enthält:

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

Erläuterung

Das _-o_ -Flag weist grep an, nur den übereinstimmenden Teil einer Zeile zu drucken, und der _-P_ aktiviert Perl-kompatible reguläre Ausdrücke, die uns _\K_ geben. Der _\K_ bewirkt, dass grep alle Übereinstimmungen verwirft, sodass das Ergebnis ist, dass _file://\K[^<]+_ mit der längsten Zeichenfolge von Nicht-_<_ übereinstimmt, die nach _file://_ kommt. .

Dies wird dann einer while-Schleife mit _IFS=_ zugeführt, um die Wortteilung bei Leerzeichen zu deaktivieren, und _-r_, um umgekehrte Schrägstriche als normale Zeichen zu behandeln.

Die Zeile _SONG="${file//%20/ }"_ konvertiert alle _%20_ in (Leerzeichen). Andernfalls wird der Fehler "Pfad nicht gefunden" zurückgegeben, wenn versucht wird, die Titel in der letzten Zeile zu kopieren.

Wenn Ihre Dateinamen _<_ enthalten können, verwenden Sie stattdessen Folgendes:

_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
_

Hinweis: Bei beiden Lösungen wird davon ausgegangen, dass keiner Ihrer Dateinamen Zeilenumbrüche enthält.

2
terdon