Files in lexikalischer Reihenfolge kopieren
Hallo, nach dem Kopieren von verschiedenen Verzeichnissen mit Mp3 Musik vom Linux-Rechner auf einen Mp3-Player waren die Musikstücke auf dem Player nicht mehr in der richtigen Reihenfolge. Die Mp3-Filenamen beginnen jeweils mit 01-, 02-, 03 -, ... Die angezeigte Reihenfolge auf dem Player entspricht eher der gespeicherten Reihenfolge im Linux-Verzeichnisfile so wie in den guten alten DOS-Zeiten. Die richtige Reihenfolge auf dem Player kann man erzeugen, wenn man die Mp3-Files einzeln kopiert. Mein erster Gedanke war, dass der cp Befehl einen Schalter haben könnte mit dem man die Kopierreihenfolge beinflussen kann. Da hab ich aber nichts gefunden. Gibt es eventuell doch eine Methode die Kopierreihenfolge des cp Befehls zu beeinflussen, ausser cp neu zu schreiben? Oder gibts einen anderen Befehl mit dem man das Gewünschte erreichen kann? Roland Langner
Am Sonntag, 5. Februar 2006 12:41 schrieb Roland Langner:
(...). Die richtige Reihenfolge auf dem Player kann man erzeugen, wenn man die Mp3-Files einzeln kopiert. Mein erster Gedanke war, dass der cp Befehl einen Schalter haben könnte mit dem man die Kopierreihenfolge beinflussen kann. Da hab ich aber nichts gefunden. (...).
Hmm. Normalerweise sollte cp schon die Dateien in der Reihenfolge kopieren, die man auch angibt. Selbst wenn man mit der Shell-Expansion arbeitet (cp *.mp3 /bla), werden die Dateien alphabetisch sortiert eingesetzt (Test: echo *.mp3). Oder benutzt du cp -r? Gruß Jan -- Life is tough, life is tougher when you're stupid.
Jan Ritzerfeld wrote:
Am Sonntag, 5. Februar 2006 12:41 schrieb Roland Langner:
(...). Die richtige Reihenfolge auf dem Player kann man erzeugen, wenn man die Mp3-Files einzeln kopiert. Mein erster Gedanke war, dass der cp Befehl einen Schalter haben könnte mit dem man die Kopierreihenfolge beinflussen kann. Da hab ich aber nichts gefunden. (...).
Hmm. Normalerweise sollte cp schon die Dateien in der Reihenfolge kopieren, die man auch angibt. Selbst wenn man mit der Shell-Expansion arbeitet (cp *.mp3 /bla), werden die Dateien alphabetisch sortiert eingesetzt (Test: echo *.mp3). Oder benutzt du cp -r?
Vielen Dank für die Antwort. Mit cp quellverzeichnis/*.mp3 zielverzeichnis funktioniert es natürlich. Ich möchte aber gern cp -r verwenden (bzw die Ordner im Konqueror copy und pasten) um z.B. alle Alben eines Interpreten mit einem Befehl übertragen zu können. Bei mehrstufigen Verzeichnissen ist es sonst zu mühsam. Roland Langner
Am Sonntag, 5. Februar 2006 13:39 schrieb Roland Langner:
Jan Ritzerfeld wrote: (...).
Oder benutzt du cp -r?
Vielen Dank für die Antwort. Mit cp quellverzeichnis/*.mp3 zielverzeichnis funktioniert es natürlich. Ich möchte aber gern cp -r verwenden (bzw die Ordner im Konqueror copy und pasten) um z.B. alle Alben eines Interpreten mit einem Befehl übertragen zu können. Bei mehrstufigen Verzeichnissen ist es sonst zu mühsam.
Für mehrstufige Verzeichnisse fällt mir spontan auch nichts ein. :-( Meine erste Idee war sowas wie: find . -maxdepth 1 -name "*.mp3" -print0 | sort -z | xargs -0 echo Mit "cp --target-directory=bla/" statt "echo" funktioniert das für eine Verzeichnisebene (-maxdepth 1). Für mehrere natürlich nicht, die Dateien landen nämlich alle im selben Verzeichnis. Vielleicht geht das mit tar? So von der Idee her wie hier: http://portal.suse.com/sdb/de/1997/09/maddin_kopieren.html Das kombiniert mit dem obigen find und dem tar-Schalter -T: find . -name "*.mp3" -print0 | sort -z | xargs -0 tar c -T - -O | (cd bla/ && tar x) Wenn tar die übergebenen Dateinamen nicht umsortiert, sollte das gehn. Achtung, das ist alles ungetestet. Für den Anfang würde ich das erstellte tar nicht einfach direkt entpacken lassen (bevor es etwas überschreibst), sondern in eine Datei schreiben: find . -name "*.mp3" -print0 | sort -z | xargs -0 tar cf test.tar -T - Danach kannst du es von Hand in dem Zielverzeichnis entpacken. Gruß Jan -- If you knew what you were doing you'd probably be bored.
Am Sonntag, 5. Februar 2006 15:08 schrieb ich:
Das kombiniert mit dem obigen find und dem tar-Schalter -T: find . -name "*.mp3" -print0 | sort -z | xargs -0 tar c -T - -O | (cd bla/ && tar x)
Moment. Das ist ziemlicher Blödsinn! Ich versuch's zu korrigieren. Gruß Jan -- Beware of programmers who carry screwdrivers.
Am Sonntag, 5. Februar 2006 15:08 schrieb ich:
find . -name "*.mp3" -print0 | sort -z | xargs -0 tar c -T - -O | (cd bla/ && tar x) find . -name "*.mp3" -print0 | sort -z | xargs -0 tar cf test.tar -T -
Das xargs -0 ist vollkommen überflüssig bzw. schädlich. So sieht's besser aus: find . -name "*.mp3" -print0 | sort -z | tar c -T - --null -O | (cd bla/ && tar x) bzw. find . -name "*.mp3" -print0 | sort -z | tar cf test.tar -T - --null Gruß Jan -- If you're strong enough, there are no precedents.
Am Sonntag, 5. Februar 2006 15:08 schrieb Jan Ritzerfeld:
Für mehrstufige Verzeichnisse fällt mir spontan auch nichts ein. :-(
Ich denke das könnte man mit einem Shellscript machen. Etwa so: alfacopy.sh quelle ziel Zuerst mit find alle Directories bestimmen, die kopiert werden sollen und dann Verzeichnis für Verzeichnis in einer Schleife alfabetisch kopieren. Ich hätte da auch gern was fertiges :-) Aber so viel Aufwand sollte so ein Script auch nicht sein. Al
Al Bogner wrote:
Am Sonntag, 5. Februar 2006 15:08 schrieb Jan Ritzerfeld:
Für mehrstufige Verzeichnisse fällt mir spontan auch nichts ein. :-(
Ich denke das könnte man mit einem Shellscript machen.
Etwa so: alfacopy.sh quelle ziel
Zuerst mit find alle Directories bestimmen, die kopiert werden sollen und dann Verzeichnis für Verzeichnis in einer Schleife alfabetisch kopieren.
Ich hätte da auch gern was fertiges :-) Aber so viel Aufwand sollte so ein Script auch nicht sein.
Al
vielen Dank für die Anregungen von Jan und Al. Das hatte ich schon befürchtet, dass ich mir ein Script schreiben muss. Hier meine Lösung, mit 2 Scripts Script1 alphacopy.sh: #!/bin/bash # $1 Quelle $2 Ziel src=`basename $1` cd $1 cd .. find $src -print | sort | xargs -n 1 onecopy $2 Script2 onecopy: #!/bin/bash if [ -d $2 ] then mkdir $1/$2 else cp $2 $1/$2 fi Meine Zwecke werden damit erfüllt. Wenn es noch eleganter geht würde es mich interessieren. Frage am Rande: Warum wurden die Postings von Jan aus dem Archiv gelöscht? Roland Langner
Am Sonntag, 5. Februar 2006 17:48 schrieb Roland Langner:
(...). Meine Zwecke werden damit erfüllt.
Was ist mit Leerzeichen in Verzeichnis- oder/und Dateinamen?
Wenn es noch eleganter geht würde es mich interessieren.
Funktionierte das mit meinem find/sort/tar-Einzeiler nicht?
Frage am Rande: Warum wurden die Postings von Jan aus dem Archiv gelöscht?
Weil ich das so eingestellt habe. ;) Gruß Jan -- Acceptance without proof is the fundamental characteristic of all religions.
Hallo Jan Jan Ritzerfeld wrote:
Am Sonntag, 5. Februar 2006 17:48 schrieb Roland Langner:
(...). Meine Zwecke werden damit erfüllt.
Was ist mit Leerzeichen in Verzeichnis- oder/und Dateinamen?
Kommen bei mir nicht vor. Habe Vorbehalte gegen Leerzeichen in Dateinamen. Hast aber recht. Muss man für eine allgemeigültige Lösung natürlich berücksichtigen.
Wenn es noch eleganter geht würde es mich interessieren.
Funktionierte das mit meinem find/sort/tar-Einzeiler nicht?
Doch, hat gut funktioniert. Zuerst dachte ich es funktioniert nicht, da ich das -name "*.mp3" einfach weggelassen habe. Es kommen nämlich noch andere Dateiendungen vor z.B. .ogg. Wenn man das -name "*.mp3" ersetzt durch -type f dann tut es das was ich benötige. Hier nochmal der Einzeiler von Jan in einem Beispiel: Das benutzte Verzeichnis beinhaltet mehrere Alben. Der Player sitzt auf /media/usbdisk : find pointer_sisters -type f -print0 | sort -z | xargs -0 tar c -T - -O | (cd /media/usbdisk && tar x) Auf dem Player befindet sich das Verzeichnis pointer_sisters mit den dazugehörigen Unterverzeichnissen. Die Musikdateien haben die richtige Reihenfolge. Ich bin begeistert. Diesen Einzeiler werde ich ich meinem Script verwenden. Nochmals vielen Dank.
Frage am Rande: Warum wurden die Postings von Jan aus dem Archiv gelöscht?
Weil ich das so eingestellt habe. ;)
Das ist aber schade. An der Lösung sind bestimmt noch andere interessiert. Roland Langner
Am Sonntag, 5. Februar 2006 19:44 schrieb Roland Langner:
Hallo Jan
Jan Ritzerfeld wrote:
Am Sonntag, 5. Februar 2006 17:48 schrieb Roland Langner:
(...). Meine Zwecke werden damit erfüllt.
Was ist mit Leerzeichen in Verzeichnis- oder/und Dateinamen?
Kommen bei mir nicht vor. Habe Vorbehalte gegen Leerzeichen in Dateinamen.
Ich auch. Aber nicht immer sind alle Dateien von mir benannt. X-)
Hast aber recht. Muss man für eine allgemeigültige Lösung natürlich berücksichtigen.
Jau, daher -print0 für find, -z für sort und --null für tar.
Wenn es noch eleganter geht würde es mich interessieren.
Funktionierte das mit meinem find/sort/tar-Einzeiler nicht?
Doch, hat gut funktioniert. Zuerst dachte ich es funktioniert nicht, da ich das -name "*.mp3" einfach weggelassen habe. Es kommen nämlich noch andere Dateiendungen vor z.B. .ogg. Wenn man das -name "*.mp3" ersetzt durch -type f dann tut es das was ich benötige.
Hehe. Das hatte ich hier auch zum Testen benutzt, weil ich zu faul war die Dateien anders "01", "02", ... zu nennen, hatte es dann aber für dich geändert. :)
(...). Die Musikdateien haben die richtige Reihenfolge. Ich bin begeistert.
Schön!
Diesen Einzeiler werde ich ich meinem Script verwenden.
Vielleicht haben die Shell-Experten auf dieser Liste noch Verbessungsideen.
Nochmals vielen Dank.
Keine Ursache. Praktisch, daß sort und tar auch mit diesen null-terminierten Strings zurechtkommen -- wußte ich auch noch gar nicht. Daher: wieder was gelernt.
Weil ich das so eingestellt habe. ;)
Das ist aber schade. An der Lösung sind bestimmt noch andere interessiert.
Sicher, aber ich beantworte hier auch wiederholende Fragen immer wieder, wenn ich eine Lösung kenne und kein anderer eine schreibt. Problematisch finde ich persönlich nämlich veraltete Anleitungen, bin ja selbst letztens wieder drauf reingefallen (aplay benutzt mittlerweile tatsächlich den resmgr). Vielleicht sollte ich das aber wirklich mal ändern, solche Probleme wie deins sind ja echt "zeitlos". :) Gruß Jan -- You can tune a piano, but you can't tuna fish.
Hallo, Am Sun, 05 Feb 2006, Roland Langner schrieb: [..]
Doch, hat gut funktioniert. Zuerst dachte ich es funktioniert nicht, da ich das -name "*.mp3" einfach weggelassen habe. Es kommen nämlich noch andere Dateiendungen vor z.B. .ogg. Wenn man das -name "*.mp3" ersetzt durch -type f dann tut es das was ich benötige.
Hier nochmal der Einzeiler von Jan in einem Beispiel: Das benutzte Verzeichnis beinhaltet mehrere Alben. Der Player sitzt auf /media/usbdisk :
find pointer_sisters -type f -print0 | sort -z | xargs -0 tar c -T - -O | (cd /media/usbdisk && tar x)
Achtung, das ist die falsche Version! Das xargs stoert. BTW: das Zielverzeichnis wuerde ich ueber eine Variable angeben. Also, da sowieso GNU tools vorausgesetzt werden: QDIR="${1:-.}" TDIR="${2:-/media/usbdisk}" find "$QDIR" -type f -print0 | sort -z \ | tar cp --null -T - | ( cd "$TDIR" && tar xpsv ; ) Statt tar koennte man auch cpio nehmen. BTW: mein 'cp' kennt keinen Schalter um das Zielverzeichnis "vorne" als Option angeben zu koennen. Noch ne Idee (UNGETESTET!): find "$QDIR" -type d -exec mkdir -p "${TDIR}/{}" \; find "$QDIR" -type f \ -printf "cp -dp '%p' '${TDIR}/%p'\n" | sort | sh Das kommt aber weder mit ', " noch Zeilenumbruch in Dateinamen zurecht. Aber immerhin ;) Die Loesung mit tar ist aber IMHO die beste und robusteste. Nicht immer sind die "einfachen" "schoenen" Loesungen die besten ;) -dnh -- "I think there is a world market for maybe five computers." -- Thomas Watson, chairman of IBM, 1943.
participants (4)
-
Al Bogner
-
David Haller
-
Jan Ritzerfeld
-
Roland Langner