uuuser1
Anmeldungsdatum: 28. April 2011
Beiträge: 257
|
Hi, kann mir jemand mal eine Zeile zusammenbasteln, die ausgehend von einem Verzeichnis ALLE Unterordner inkl. Unterdateien nach folgenden Regeln umbenennt? Alle Buchstaben des Dateinamens und der Dateiendung in Kleinbuchstaben
ö zu oe, ü zu ue, und ä zu ae sowie ß zu ss ersetzen
Alle Zeichen durch _ ersetzen, die nicht [a-z][0-9] sind (außer natürlich der punkt vor der dateiendung)
Wenn zwei oder mehrere _ aufeinander treffen, sollen diese durch eines ersetzt werden
UTF8 Danke soweit!
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Wo liegt denn das Problem? find oder sed oder was?
|
uuuser1
(Themenstarter)
Anmeldungsdatum: 28. April 2011
Beiträge: 257
|
Das Problem liegt vor allem bei dem regulären Ausdruck, der das erledigt.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
uuuser1 schrieb: Das Problem liegt vor allem bei dem regulären Ausdruck, der das erledigt.
| $ echo 'Ab:*cÖöÜüÄäß.foo' | sed -re 's#ß#ss#g;s#ä#ae#ig;s#ö#oe#ig;s#ü#ue#ig;s#[^a-z.]+#_#ig' | tr A-Z a-z
ab_coeoeueueaeaess.foo
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Das behält aber vorletzte und vorige Punkte aber bei:
| echo 'Ab:*cÖöÜüÄäß....foo.bar' | sed -re 's#ß#ss#g;s#ä#ae#ig;s#ö#oe#ig;s#ü#ue#ig;s#[^a-z.]+#_#ig' | tr A-Z a-z
ab_coeoeueueaeaess....foo.bar
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
user unknown schrieb: Das behält aber vorletzte und vorige Punkte aber bei:
| echo 'Ab:*cÖöÜüÄäß....foo.bar' | sed -re 's#ß#ss#g;s#ä#ae#ig;s#ö#oe#ig;s#ü#ue#ig;s#[^a-z.]+#_#ig' | tr A-Z a-z
ab_coeoeueueaeaess....foo.bar
|
Das stimmt. Ich hatte das allerdings nicht so interpretiert, dass alle Punkte vor dem letzten entfernt oder ersetzt werden sollen. Man hat ja durchaus auch mal mehrere Punkte in Dateinamen, z.B. "foo.tar.gz" oder auch "mein-paket-v1.8.2.deb". Insofern würde ich Punkte immer drin lassen. Aber ich bin ja nicht uuuser1. ☺
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
rklm schrieb:
Das stimmt. Ich hatte das allerdings nicht so interpretiert, dass alle Punkte vor dem letzten entfernt oder ersetzt werden sollen. Man hat ja durchaus auch mal mehrere Punkte in Dateinamen, z.B. "foo.tar.gz" oder auch "mein-paket-v1.8.2.deb".
Das sind vernünftige Einwände, aber die sprachliche Formulierung Alle Zeichen durch _ ersetzen, die nicht [a-z][0-9] sind (außer natürlich der punkt vor der dateiendung)
- auch wenn der Fall falsch benutzt wurde, spricht klar von einer Einzahl - der Punkt vor der Endung. Wahrscheinlich hat der User noch keine Dateien mit verketteten Endungen und multiplen Punkten zu behandeln gehabt oder nicht dran gedacht.
|
uuuser1
(Themenstarter)
Anmeldungsdatum: 28. April 2011
Beiträge: 257
|
Danke soweit schon mal für eure Hinweise. Gibt es denn eine Norm für Dateinamen außer 8.3 an die man sich halten sollte. Gerne würde ich alle meine Dateinamen dann nach dieser Norm entsprechend umbenannt habe. Danke!
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
uuuser1 schrieb:
Gibt es denn eine Norm für Dateinamen außer 8.3 an die man sich halten sollte.
Es gibt nicht die eine Norm. Linux-Dateisysteme sind sehr tolerant, was Zeichen in Dateinamen angeht (dort ist eigentlich nur "/" und NUL verboten, siehe hier). Die Windows-Dateisysteme verbieten z.B. ":", weil das als Trennzeichen zwischen Gerätenamen und Pfad genutzt wird. "\" müsste auch verboten sein, weil das unter Windows der Pfadtrenner ist. Dann gibt es den generellen Ratschlag solche Dinge wie Tab, Return und Newline nicht in Dateinamen zu verwenden, weil das zu diversen Problemen bei der Anzeige und Verarbeitung führen kann. Leerzeichen schmecken manchen Skripten und Programmen auch nicht (was m.E. aber eher ein Programmierfehler ist).
Gerne würde ich alle meine Dateinamen dann nach dieser Norm entsprechend umbenannt habe.
Wenn Du Dich auf 7Bit-ASCII-Buchstaben, Ziffern, Unterstrich und Bindestrich bzw. Minuszeichen beschränkst, bist Du auf jeden Fall auf der sicheren Seite. Das ist aber nicht nötig, wenn Du Deine Dateien nur lokal auf Deinem Rechner verwendest. Wie so oft lautet die Antwort: "es kommt darauf an." ☺
|
uuuser1
(Themenstarter)
Anmeldungsdatum: 28. April 2011
Beiträge: 257
|
Hi, erst mal vielen Dank für eure Rückmeldung! Ich habe mich jetzt wie folgt festgelegt und würde dabei gerne auch etwas über RE lernen: Alle Dateien und Ordner sollen rekursiv wie folgt unbenannt werden: ä, ü, ö zu a, u, o ß zu ss name in kleinbuchstaben alles außer [a-z][0-9][.-] mit MINUS ersetzen sollten nach Umbenennen mehrere MINUSe oder Punkte aufeinandertreffen, sollen diese durch ein einzelnes ersetzt werden
Beispiel: | Hallö-Schönen___#1GutenMorgen...testpunkte.endung1.endung2
--> hallo-schonen-1gutenmorgen.testpunkte.endung1.endung2
|
Kann man das in einem Schritt durchführen oder läuft das dann über zwei Kommandozeilen?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
uuuser1 schrieb: Ich habe mich jetzt wie folgt festgelegt und würde dabei gerne auch etwas über RE lernen:
Welche denn? PCRE, GNU Regex, Python Regex, ...?
Suchmaschine auf und los gehts - die Häppchen findet man z.B. schön über Stackoverflow verteilt ☺ Die Umwandlung in Kleinbuchstaben kann man zuerst abarbeiten, dann muss man die Großschreibung von ä, ö, ü nicht berücksichtigen. Gleiche Zeichen darf man auch mit sich selbst ersetzen.
| a="Hallö-Schönen___#1GutenMorgen...testpunkte.endung1.endung2"
echo "$a" | sed -e 's/\(.*\)/\L\1/;s/ä/a/g;s/ö/o/g;s/ü/u/g;s/ß/ss/g;s/[^[:alnum:]\.]/-/g;s/--*/-/g;s/\.\.*/\./g'
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Kosmetische Änderungsvorschläge:
| echo "$a" | sed -re 's/(.*)/\L\1/;s/ä/a/g;s/ö/o/g;s/ü/u/g;s/ß/ss/g;s/[^[:alnum:].]/-/g;s/-+/-/g;s/\.+/./g'
|
sed -r erlaubt es die Gruppenklammern ohne Maskierung zu schreiben. s/alnum.] Der Punkt in einer Zeichengruppe muss nicht maskieren - Punkt in der Gruppe als Wildcard macht keinen Sinn, denn das gleiche drückt ein einzelner Punkt ohne Gruppe bereits aus, inkl. dem ganzen Rest der Gruppe. s/–*/-/ kann durch /-+/-/ ersetzt werden, mindestens ein Zeichen vor dem + - so auch beim Punkt. s/\.+/./g Der Ersetzungspunkt muss auch nicht maskiert werden. Was sollte sed denn als 'beliebiges Zeichen' zum Ersetzen wählen?
Sed ist in dieser Hinsicht voller Aussnahmen, die sich aber alle prima logisch herleiten lassen.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
In der Praxis biete sich dafür das Perl-rename an. (das ist bei allen Debians und *buntus sowieso standardmäßig aktiv) Dort kannst Du die sed- Befehle einfach übernehmen: track@lucid:~$ echo "$a" | perl -pe 's/\(.*\)/\L\1/;s/ä/a/g;s/ö/o/g;s/ü/u/g;s/ß/ss/g;s/[^[:alnum:]./-/g;s/--*/-/g;s/\.\.*/./g'
Hallo-Schonen-1GutenMorgen.testpunkte.endung1.endung2 Allerdings gibt es da ein Problem: die Verzeichnistrenner "/" werden ebenfalls in "-" umgewandelt, also wird alles in ein einziges Verzeichnis gestopft ! Das sollte man nochmal nachbessern, und immer mit rename -nv testen. LG, track
|
uuuser1
(Themenstarter)
Anmeldungsdatum: 28. April 2011
Beiträge: 257
|
Danke soweit. UPDATE: Danke track für deinen Hinweis!
|
uuuser1
(Themenstarter)
Anmeldungsdatum: 28. April 2011
Beiträge: 257
|
Wieso ersetzt mir der folgende Ausdruck das ö mit 3(!) –- und einem seltsamen Zeilenumbruch ? | a="ö"
echo "$a" | perl -pe 's/[^a-z0-9]/-/g;'
|
Eigentlich bedeutet das doch: Suche nach allem, was nicht a-z oder 0-9 ist, und mache ein - daraus oder?
|