Am Sonntag, 14. Februar 2010 20:11:21 schrieb David Haller: Hallo David,
Normalerweise ist die Option $1. Ich verstehe aber nicht wie die übergeben wird.
Dann denk dir ein 'DIR="$1"' als erste Zeile nach #!/bin/bash ;)
Hatte ich, aber dann nur die Hälfte kapiert. Bei dir rechne ich immer, dass du eine Konstruktion hast, die für mich Neuland ist, aber eigentlich war es trivial.
Ich nahm bisher an, daß das nicht unbedingt als script gedacht ist.
Ich denke das wird am besten sein. So ganz genau weiß ich noch nicht, was ich will. gegeben sind zigtausend oder vielleicht hundertausende avi-Schnipsel, die in Ordner zugeordnet werden müssen. Eventuell kann ich die Sortierung nur erreichen, indem ich 2 mal die Dateien im Ordner durch das Skript umbenenne und erst dann verschiebe. Die Praxis wird es zeigen. Es werden aber noch einige Tage vergehen, bis ich damit anfangen kann.
(denn dann verwendet find per default '.' als Startordner und dann ist der Verzeichnisname beim Umbenennen (s.u.) eben "." und damit nicht sinnvoll verwendbar. In dem Fall wird DIR eben auf $PWD gesetzt und man bekommt (s.u.) den Namen des Verzeichnisses.
Du nimmst also an, dass das Verzeichnis abgearbeitet wird, in dem man sich befindet?
Nein. Das, was per DIR (s.o.) übergeben wird. Dort wird dann jedes Unterverzeichnis _einzeln_ verwurstet (d.h. die darin befindlichen *.avi umbenannt). Das ist die pushd+popd Geschichte.
[..]
Einfach gesagt: ${d##*\/} == $(basename "$d") == Verzeichnisname.
Muss ich noch besser verarbeiten
man bash -> nach :- suchen, da landest du IIRC recht genau in dem Abschnitt wo das erklärt wird.
die bash sortiert das Ergebnis der Expansion alphabetisch bzw. gemäß LC_COLLATE. Und das reicht dir evtl. nicht.
Vermutlich schon.
Ein Band hat Dateiname + Nummer, manchmal ist eine Bandnummer vor dem Text.
024_coteazur_3_0001.avi 024_coteazur_3_0002.avi
Dann dürfte Sortierung nach LC_COLLATE=POSIX oder =de_DE reichen, d.h. man könnte wohl schlicht die Shell den '*' expandieren lassen und sich ein explizites 'sort' sparen. Aber s.u.
Achso, oder wolltest du _verzeichnisübergreifend_ alphabetisch sortieren
Das hätte ich mir schon gewünscht.
Als Option wird ein Verzeichnis angegeben, überprüft, ob dieses existiert und dann mit find alle avi-Dateien gesucht, die alfabetisch sortiert und dann mit dem Ordnernamen durchnummeriert. 4 stellen sollten reichen, also max. 000x.
_WO_ willst du sortieren?
Innerhalb a) jedes einzelnen Unterverzeichnisses oder willst du _alle_ Dateien ab dem Startverzeichnis b) mit oder c) ohne die jew. Unterver- zeichnisse sortieren?
Genau genommen werde ich das erst in der Praxis feststellen, was ich brauche, theoretisch denke ich mir, dass ich in der Regel keine Unterverzeichnisse brauche, aber es könnte notwendig oder zumindest einfacher werden, zB wenn aus mehreren Ordnern zusammengemischt wird. Ich nehme folgendes an. Im Ordner A und B und C befinden sich Dateien, die ich in einen Ordner D verschiebe, der oberhalb von A, B und C ist, d.h. unterhalb von D befinden sich keine Dateien und nur Ordner, worin sich dann aber Dateien befinden. Nun sollen alle Dateien umbenannt und verschoben werden. Die Dateien erhalten also den Namen von Ordner D und werden unterhalb von D geschoben. In A, B und C befinden sich dann also keine avi-Dateien mehr. Eventuelle andere Dateien sollen in A, B und C erhalten bleiben. Letztlich wird sich alles danach richten, wie ich zusammengehörende Dateien am besten organsiere bzw. manuell zuordne, bevor das Skript darüber läuft.
und umbenennen? Oder nur, wie von mir angenommen, jew. pro Verzeichnis? Ersteres ginge auch, würde aber einige Trickserei mit Dateilisten erfordern.
Mit for und ohne Leerzeichne im Dateinamen habe ich da wenig getrickst ;-)
Einfach find ... | sort.
Das wäre Variante b). Sortiert wird "nach Text" die Dateiliste, wie sie ein find . -type f | sort ausspuckt, und die Dateien dieser Liste dann eben umbenamst? Also z.B. alle Dateien aus ./bla/ landen (umbenamst) vor allen Datein aus ./foo/? Also z.B.:
./bla/bla_0001.avi \ ... > = alles aus bla ./bla/bla_0123.avi / ./foo/foo_0124.avi \ ... > = alles aus foo ./foo/foo_0154.avi /
Das wäre schon (bis auf das bestimmen des Verzichnisnamens) wieder trivial. find | sort und ne Zählervariable.
So habe ich es mir vorgestellt, aber du hast mir andere Möglichkeiten bewusst gemacht.
Mail mir doch evtl mal ein _konkretes_ (gekürztes) Beispiel per PM.
Es ist noch vieles theoretisch. Ich kann dir kein ls oder so schicken, das was bringt. Ich hoffe mein obiges Beispiel ist klar. Primär wäre das wichtig Ordnername: frankreich: 024_coteazur_3_0001.avi 024_coteazur_3_0002.avi 024_coteazur_3_0259.avi 024_coteazur_3_0260.avi Dateien werden umbenannt in: 024_coteazur_3_0001.avi -> frankreich_0001.avi 024_coteazur_3_0002.avi -> frankreich_0002.avi 024_coteazur_3_0259.avi -> frankreich_0003.avi 024_coteazur_3_0260.avi -> frankreich_0004.avi Gibt es Unterverzeichnisse und nehmen wir für alle Fälle die unwahrscheinliche Situation an, dass sich auch direkt darunter Dateien befinden, dann soll sich folgendes ergeben: Ordnername: frankreich: 024_coteazur_3_0001.avi 024_coteazur_3_0002.avi 024_coteazur_3_0259.avi 024_coteazur_3_0260.avi darunter ein Verzeichnis museum irgendwas_0001.avi irgendwas_0002.avi darunter ein Verzeichnis konzert auchwas_0001.avi auchwas_0002.avi Für die Sortierung ist "museum" und "konzert" unerheblich, sortiert wird nur nach dem Dateinamen. Also 024_coteazur_3_0001.avi 024_coteazur_3_0002.avi 024_coteazur_3_0259.avi 024_coteazur_3_0260.avi auchwas_0001.avi auchwas_0002.avi irgendwas_0001.avi irgendwas_0002.avi und das wird dann umbenannt in 024_coteazur_3_0001.avi -> frankreich_0001.avi 024_coteazur_3_0002.avi -> frankreich_0002.avi 024_coteazur_3_0259.avi -> frankreich_0003.avi 024_coteazur_3_0260.avi -> frankreich_0004.avi auchwas_0001.avi -> frankreich_0005.avi auchwas_0002.avi -> frankreich_0006.avi irgendwas_0001.avi -> frankreich_0007.avi irgendwas_0002.avi -> frankreich_0008.avi Wenn das zu kompliziert ist, dann reicht auch Variante 1. Dann muss ich das eben manuell machen und 2x das Skript laufen lassen. Wie schon geschrieben, die Details werde ich erst wissen, wenn ich zusammengehörende Dateien verschiebe und dabei auf Ideen komme, wie ich am besten den Überblick behalte. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org