datei mit dir-names erzeugen

A

apoca

Lypse
Ich habe meine Alben nach dem Prinzip
/mnt/Alben/Interpret1/Album1
/mnt/Alben/Interpret1/Album2
/mnt/Alben/Interpret2/Album3

etc etc

geordnet und will nun per shell-Skript in jedem Album-Ordner eine Datei, die so aussieht: -----$Interpret- $Album-----,mp3 , was zur besseren Ordnung einer Playlist führt. Wie lässt sich sowas machen??
 
Schnellschuss:

Code:
for i in $(find /mnt/Alben -type d -depth 2); do echo $i | perl -an -F'/' -e 'chomp @F; print "-----$F[($#F-1)]-$F[$#F]-----,mp3"'>$i/datei; done

Gruss, Xanti
 
Hallo
Was meinst du mit aussehen?
Soll die Datei diesen Inhalt haben und in diesem Verzeichnis liegen?

Wenn ja, dann versuch es mal mit folgendem Vorschlag, den du noch anpassen musst.
Code:
for i in $(find /mnt/Alben/ -type d -printf "%p\n");  do cd $i;ST=${PWD#*/Alben/};echo "-----${ST//\//-----}.mp3">Datei;done

Sehe gerade Xanti war schneller, belass aber meine Version trotzdem mal hier, als Alternative.
:D

Gruß Wolfgang
 
Zuletzt bearbeitet:
Code:
apoca@krx[~]% for i in $(find /mnt/Alben -type d -depth 2); do echo $i | perl -an -F'/' -e 'chomp @F; print "-----$F[($#F-1)]-$F[$#F]-----,mp3"'>$i/datei; done
find: warning: you have specified the -depth option after a non-option argument -type, but options are not positional (-depth affects tests specified before it as well as those specified after it).  Please specify options before other arguments.

find: Der Pfad muß vor dem Suchkriterium stehen.
Usage: find [-H] [-L] [-P] [path...] [expression]

Xanti, Geht soweit also noch nicht :-/

Wolfgang, bei dir exitet es mit einer Fehlermeldung, dass es ganz viele dateien nicht findet... Liegt wohl daran, dass auch Spaces in $Album oder $Interpret vorhanden sind

Also, es soll einfach eine Datei mit dem Namen -----$Interpret - $Album-----,mp3 erzeugt werden und in /mnt/music/Alben/Interpret/Album liegen, also in dem Dir in dem dieses eine Album liegt.
 
Zuletzt bearbeitet:
@apoca: Welches OS?

@Wolfgang: Hallo Wolfgang, lange nicht gesehen :)
 
Hallo,
mein Beispiel geht davon aus, dass deine Verzeichnisse nur zwei Ebenen tief gehen.
Sonst solltest du eventuell mit -maxdepth 2 arbeiten.
Code:
for i in $(find /mnt/Alben/ -maxdepth 2 -type d -printf "%p\n");  do cd $i;ST=${PWD#*/Alben/};echo "-----${ST//\//-----}.mp3">Datei;done
man find
;)
Gruß Wolfgang
 
Hallo Xanti , brauch ich doch nicht mehr so oft, du machst das schon gelle ;)

Hallo apoca
( Ich hatte mein Posting schon abgedrückt, bevor ich deine Antwort las)

Wenn du Leerzeichen hast, dann musst du eben mit xargs und -print0 arbeiten, bzw die Variablen Quoten.
Wenn die Datei diesen Namen ohne eigenen Inhalt haben soll, verwende einfach touch statt echo.
Den Rest belass ich dir zum selber basteln. ;)

Gruß Wolfgang
 
Hmm, also nur Optionen umschaufeln. Da unterscheidet sich meine FreeBSD-find-Version von der von Debian.

@Wolfgang: Werden bei "-maxdepth 2" nicht auch die Verzeichnisse erschlagen, die Tiefe 1 haben? Oder ist das noch ein Unterschied in den find-Versionen? :think:
 
Da ich leider keine Ahnung von shell-Skripten habe, kann ich mit xargs und -print0 wirklich wenig anfangen. Basteln ist nicht so mein Ding. Darum hab ich ja hier gefragt...
 
@apoca: Kann Dir da nicht weiterhelfen, da ich eine andere Version von find und xargs habe, die sich stark von Deiner unterscheidet. Da muss Wolfgang oder jemand anderes ran :D

edit: Parallel kannst Du in die info-Pages von find/xargs schauen, da stehen meistens einfache Beispiele drin. ("info find" in die Konsole eingeben.)
 
Zuletzt bearbeitet:
Das hab ich jetzt mal gemacht.

Code:
for I in $(ls /mnt/music/Alben/)
do
for A in $(ls /mnt/music/Alben/$I)
  do
   touch /mnt/music/Alben/$I/$A/-----$I\ -\ $A-----.mp3
  done
done

Wie mach ich da ne Abfrage, dass er die Datei nur erzeugt, falls sie noch nicht vorhanden ist?
 
Wenn Du touch benutzt, musst Du nicht abfragen, ob die die Datei bereits existiert: existiert sie nicht, wird sie angelegt; existiert sie, wird nur die ctime/mtime der Datei geändert.

Gruss, Xanti
 
Hm, da ist jetzt immer noch das Problem mit den Spaces. Wie kann man das lösen?
 
Hallo


Code:
for i in $(find /mnt/Alben -type d -depth [color=red][b]2[/b][/color]); do echo $i | perl -an -F'/' -e 'chomp @F; print "-----$F[($#F-1)]-$F[$#F]-----,mp3"'>$i/datei; done

-depth akzeptiert IMHO keinen Parameter.

Die Reihenfolge ist für depth aber egal.
Lediglich die Bedingungen werden von Links nach Rechts aufgelöst.

Also solltest du einfach die 2 weglassen, oder wenn die Tiefe auf 2 festgelegt sein soll -maxdepth 2 verwenden.
Das Konstrukt von Xanti sollte dank Perl auch mit Leerzeichen klarkommen, wenn man es etwas anpasst und xargs einfügt.

Code:
find /mnt/Alben -depth -type d -print0 |xargs -0 -n1|perl -an -F'/' -e 'chomp @F;print "-----$F[(@F-1)]-$F[$#F]-----.mp3\n" unless (/^[.]+/)'
Statt print kannst du natürlich auch ein touch als system absetzen. Der Pfad steht ja dann in $_. ;)

Aber du willst nicht wirklich Dateinamen mit Leerzeichen erzeugen, wenn du damit nicht klarkommst. :oldman

Gruß Wolfgang
 
Quick&Dirty:
Code:
find /mnt/music/Alben -maxdepth 2 -mindepth 2 -type d -print0 \
| xargs -n1 -0 echo "{}" \
| perl -anl -F'/' -e 'system "touch \"/mnt/music/Alben/$F[($#F-1)]/$F[$#F]/-----$F[($#F-1)]-$F[$#F]-----,mp3\""'

edit: Ups, Wolfgang war schneller ;)

edit2:
Wolfgang schrieb:
-depth akzeptiert IMHO keinen Parameter.

Stimmt, hab mir die man-Page von find (Linux) angeschaut. In FreeBSD gehts:

Code:
     -depth  Always true; same as the -d option.

     -depth n
             True if the depth of the file relative to the starting point of
             the traversal is n.

Muss man halt mit -min-depth und -max-depth arbeiten.
 
Zuletzt bearbeitet:

Ähnliche Themen

Samba Dateien und Ordner verschieben

Dateiensortierung

Backup Skript automatisch ausführen mit udev

Samba PDC (Ubuntu Feisty) lässt keine Logins zu und zeigt Netbios Namen nicht an

"Zahlersetzung"

Zurück
Oben