staging.inyokaproject.org

Dateien aus Liste verlinken - Ordnerstruktur behalten

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

aus_Hamburg

Avatar von aus_Hamburg

Anmeldungsdatum:
21. Februar 2008

Beiträge: 160

Moin,

ich möchte gerne Lieder, die ich in einer Wiedergabeliste gespeichert habe (temporär) in ein Verzeichnis verlinken, um sie dann von dort gesammelt auf den MP3-Player zu kopieren (und dort die gleiche Wiedergabeliste nutzen).

Mit folgendem Befehl bekomme ich alle Dateien aus einer Liste in einen Ordner verlinkt, allerdings geht dabei die Ordnerstruktur verloren.

cat Liste.m3u | tr "\n" "\0" | xargs -0 -I{} cp -l {} '~/Musik/Wiedergabeliste/Export/'

Wie kann ich die Ordnerstruktur behalten?

So sieht die Ausgangs-Struktur aus:

Musik/Wiedergabeliste/Liste.m3u
Musik/Artist1/Album1/Track1.mp3
Musik/Artist1/Album1/Track2.mp3
Musik/Artist1/Album2/Track3.mp3
Musik/Artist1/Track4.mp3

So soll der Export-Ordner am Ende aussehen:

Musik/Wiedergabeliste/Export/Artist1/Album1/Track1.mp3
Musik/Wiedergabeliste/Export/Artist1/Album1/Track2.mp3
Musik/Wiedergabeliste/Export/Artist1/Album2/Track3.mp3
Musik/Wiedergabeliste/Export/Artist1/Track4.mp3

Vielen Dank aus HH

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Dafür musst du die Ordnerstruktur erst anlegen und dann für jede Datei den Pfad entsprechend zusammenbauen

target=~/Musik/Wiedergabeliste/Export
xargs dirname < Liste.m3u | sort -u | sed "s#^#$target/#" | xargs mkdir -p
xargs -I{} cp -l {} "${target}/{}" < Liste.m3u  

aus_Hamburg

(Themenstarter)
Avatar von aus_Hamburg

Anmeldungsdatum:
21. Februar 2008

Beiträge: 160

Vielen Dank, immer wieder faszinierend mit wie wenig Zeilen Profis solche Aufgaben erledigen können. 👍

Allerdings habe ich noch Probleme mit den Leerzeichen in den Pfaden und Dateinamen. Hier mein kläglicher Versuch, der nicht zum Ziel führt:

#!/bin/bash
IFS=$'\n'       # make newlines the only separator
set -f          # disable globbing
target=~/Musik/Wiedergabeliste/Export
xargs -0 dirname < Liste.m3u | sort -u | sed "s#^#$target/#" | xargs -0 mkdir -p
xargs -0 -I{} cp -l {} "${target}/{}" < Liste.m3u 

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

sort und sed kennen eigene Flags für null-terminierte Strings - probier es mal so:

1
2
xargs -0 dirname < Liste.m3u | sort -zu | sed -z "s#^#$target/#" | xargs -0 mkdir -p
tr "\n" "\0" Liste.m3u | xargs -0 -I{} cp -l {} "${target}/{}"

aus_Hamburg

(Themenstarter)
Avatar von aus_Hamburg

Anmeldungsdatum:
21. Februar 2008

Beiträge: 160

Da stimmt noch etwas nicht

tr: zusätzlicher Operand „Liste.m3u“ 

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Ah, tr liest immer von stdin - dann so:

1
2
tr "\n" "\0" < Liste.m3u | xargs -0 dirname -z | sort -zu | sed -z "s#^#$target/#" | xargs -0 mkdir -p
tr "\n" "\0" < Liste.m3u | xargs -0 -I{} cp -l {} "${target}/{}"

Edit: Die Ausgabe von dirname muss auch noch null-terminierte Strings liefern

aus_Hamburg

(Themenstarter)
Avatar von aus_Hamburg

Anmeldungsdatum:
21. Februar 2008

Beiträge: 160

Super, jetzt funktioniert es! Vielen Dank.

Nur ein kleiner Schöneheitsfehler: Im Ordner Export wird nun der Gesamte Pfad nachgebildet Export/home/... Kann man die Struktur auf Export/Artist/... begrenzen?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

aus_Hamburg schrieb:

Nur ein kleiner Schöneheitsfehler: Im Ordner Export wird nun der Gesamte Pfad nachgebildet Export/home/... Kann man die Struktur auf Export/Artist/... begrenzen?

Ich kann mir das gerade nur so vorstellen, dass du da absolute Pfade in der m3u-Playlist hast - oder stehen da wie in deinem ersten Post relative Pfad drin?

aus_Hamburg

(Themenstarter)
Avatar von aus_Hamburg

Anmeldungsdatum:
21. Februar 2008

Beiträge: 160

Je nachdem welche Software ich zur Erstellung der m3u-Listen verwende, sind die Pfadangaben gemischt. Daher nutze ich nun zuvor relm3u um alle Pfade relativ anzugeben.

Das fertige Script sieht nun so aus und erstellt aus allen m3u-Dateien die entsprechenden Exportordner. Du könntest das bestimmt schöner, aber es funktioniert 😀

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/bash
IFS=$'\n'       # make newlines the only separator

SCRIPT_DIR=${PWD};
echo $SCRIPT_DIR;
relm3u "$SCRIPT_DIR""/" -s;

for file in *.m3u;
    do 
    echo $file;
    target="$SCRIPT_DIR""/Export/""${file%.*}""/""${file%.*}";
    set +o noglob
    tr "\n" "\0" < $file | xargs -0 dirname -z | sort -zu | sed -z "s#^#$target/#" | xargs -0 mkdir -p
    tr "\n" "\0" < $file | xargs -0 -I{} cp -l {} "${target}/{}"
    rm -R $target;
    set -o noglob
done

Vielen Dank nochmal die Unterstützung

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

aus_Hamburg schrieb:

Das fertige Script sieht nun so aus und erstellt aus allen m3u-Dateien die entsprechenden Exportordner. Du könntest das bestimmt schöner, aber es funktioniert 😀

Ein bisschen Feedback:

  • Du solltest shopt -s nullglob verwenden, wenn Du schon die bash nutzt, weil dann die Schleife nicht durchlaufen wird, falls keine .m3u-Dateien vorhanden sind.

  • Du nutzt viel zu viele doppelte Anführungsstriche, z.B. in Zeilen 6 und 11. (s.u.)

  • Ich würde auf jeden Fall $file doppelt quoten - könnten ja Leerzeichen und andere Sonderzeichen in den Dateinamen sein.

1
2
3
4
5
# vorher
target="$SCRIPT_DIR""/Export/""${file%.*}""/""${file%.*}";
# nachher
f="${file%.*}"
target="$SCRIPT_DIR/Export/$f/$f"

aus_Hamburg

(Themenstarter)
Avatar von aus_Hamburg

Anmeldungsdatum:
21. Februar 2008

Beiträge: 160

Vielen Dank.

  • Der erste Punkt ist mir nicht klar, die Schleife wird doch nur für *.m3u Dateien durchlaufen.?

  • War der falschen Annahme Variablen müssten stets per Anführungszeichen getrennt sein...

  • Leerzeichen funktionierten zwar schon vorher, aber Sonderzeichen hatte ich noch nicht geprüft.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

aus_Hamburg schrieb:

Vielen Dank.

  • Der erste Punkt ist mir nicht klar, die Schleife wird doch nur für *.m3u Dateien durchlaufen.?

Das ist, wie Shell-Globbing arbeitet:

1
2
3
$ ls
$ for f in *.m3u; do echo "$f"; done
*.m3u
  • Leerzeichen funktionierten zwar schon vorher, aber Sonderzeichen hatte ich noch nicht geprüft.

In Zeile 15 gibt es Probleme mit Leerzeichen.

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1575

rklm schrieb:

In Zeile 15 gibt es Probleme mit Leerzeichen.

Das heißt, quoten:

1
rm -R "$target";
Antworten |