У меня есть плей-лист 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>
Это должно сделать это, предположив, что ни одни из Ваших имен файлов не содержат <
:
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
Примечание: Оба решения предполагают, что ни одни из Ваших имен файлов не содержат новые строки.