killercorny
Anmeldungsdatum: 24. März 2015
Beiträge: 53
Wohnort: Brandenburg
|
Moins Leute! Ich bin dabei meine Musiksammlung zu organisiern und zu bereinigen. Dabei möchte ich alle Ordner- & Dateinamen rekursiv(!) Linux-konform von Leerzeichen sowie Unterstrichen bereinigen.
Mein Script dafür: | #!/bin/bash
# Dieses kleine Script ersetzt leerzeichen und Unterstriche durch Punkte...
echo Benenne um...
echo
for i in $( find ./ );
do
rename -v 's/ /./g;s/_/./g;' *
done
echo
echo Fertig!
|
Das funktioniert soweit auch ganz gut. Nur habe ich manchmal den Fall, das dann zwei Punkte hintereinander ".." im Dateinamen erscheinen. Diese möchte natürlich auch raus haben.
Eigentlich ganz banal, aber mit rename funktioniert das nicht:
Wenn ich das ausführe bekomme ich ganz viele Ordner & Dateien mit einigen Punkten heraus ☹ Kann mir jemand helfen?
|
misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
Das Pattern ist ein regulärer Ausdruck. Ein Punkt matched bei RegEx auf ein beliebiges Zeichen. Dein Ausdruck heißt also:
s/.././g
Suche 2 beliebige Zeichen und ersetze sie durch einen Punkt.
Du brauchst aber:
s/\.\././g
Suche 2 Punkte und ersetze sie durch einen Punkt.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
killercorny schrieb: Moins Leute! Ich bin dabei meine Musiksammlung zu organisiern und zu bereinigen. Dabei möchte ich alle Ordner- & Dateinamen rekursiv(!) Linux-konform von Leerzeichen sowie Unterstrichen bereinigen.
Mein Script dafür: | #!/bin/bash
# Dieses kleine Script ersetzt leerzeichen und Unterstriche durch Punkte...
echo Benenne um...
echo
for i in $( find ./ );
do
rename -v 's/ /./g;s/_/./g;' *
done
echo
echo Fertig!
|
Das funktioniert soweit auch ganz gut.
Mit *? Wozu dann das i? Müsste da nicht $i stehen? Find ist übrigens schon ein Iterator - da muss man kein for drumrumbauen. Der Punkt als Muster steht für beliebige Zeichen und muss links maskiert werden. | find -depth -execdir rename -v 's/ /./g;s/_/./g;s/\.\.+/./g' {} ";"
|
|
killercorny
(Themenstarter)
Anmeldungsdatum: 24. März 2015
Beiträge: 53
Wohnort: Brandenburg
|
user_unknown schrieb:
Mit *? Wozu dann das i? Müsste da nicht $i stehen? Find ist übrigens schon ein Iterator - da muss man kein for drumrumbauen. Der Punkt als Muster steht für beliebige Zeichen und muss links maskiert werden.
Naja, das war so gewachsen, hab erst anders damit angefangen...
| find -depth -execdir rename -v 's/ /./g;s/_/./g;s/\.\.+/./g' {} ";"
|
Danke, das funktioniert perfekt, und ist sogar ein Einzeiler ^^ EDIT: Wäre es noch möglich, dass man nicht nur 2 Punkte ersetzt sondern beliebig viele Punkte hintereinander?
|
ostcar
Ehemalige
Anmeldungsdatum: 27. Juli 2006
Beiträge: 2748
Wohnort: Leipzig
|
killercorny schrieb: user_unknown schrieb: | find -depth -execdir rename -v 's/ /./g;s/_/./g;s/\.\.+/./g' {} ";"
|
Danke, das funktioniert perfekt, und ist sogar ein Einzeiler ^^ EDIT: Wäre es noch möglich, dass man nicht nur 2 Punkte ersetzt sondern beliebig viele Punkte hintereinander?
| find -depth -execdir rename -v 's/[ _\.]+/./g' {} ";"
|
Bei diesem regulären Ausdruck wird nach einem Zeichen gesucht, welches entweder ein Whitespace (Leerzeichen, Tabulator, Zeilenumbruch), ein Unterstrich oder ein Punkt ist. Das plus Zeichen bedeutet, dass das gefundene Zeichen einmal oder mehrfach auftreten darf. Hierbei können sich Punkte, Unterstriche und Whitespaces auch abwechseln. Die komplette gefundene Gruppe wird durch einen Punkt ersetzt.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
killercorny schrieb:
Ich bin dabei meine Musiksammlung zu organisiern und zu bereinigen. Dabei möchte ich alle Ordner- & Dateinamen rekursiv(!) Linux-konform von Leerzeichen sowie Unterstrichen bereinigen.
Leerzeichen und Unterstriche sind Linux-konform.
|
killercorny
(Themenstarter)
Anmeldungsdatum: 24. März 2015
Beiträge: 53
Wohnort: Brandenburg
|
ostcar schrieb: | find -depth -execdir rename -v 's/[ _\.]+/./g' {} ";"
|
Bei diesem regulären Ausdruck wird nach einem Zeichen gesucht, welches entweder ein Whitespace (Leerzeichen, Tabulator, Zeilenumbruch), ein Unterstrich oder ein Punkt ist. Das plus Zeichen bedeutet, dass das gefundene Zeichen einmal oder mehrfach auftreten darf. Hierbei können sich Punkte, Unterstriche und Whitespaces auch abwechseln. Die komplette gefundene Gruppe wird durch einen Punkt ersetzt.
Funktioniert noch besser, Danke noch mal an alle! rklm schrieb: killercorny schrieb:
Ich bin dabei meine Musiksammlung zu organisiern und zu bereinigen. Dabei möchte ich alle Ordner- & Dateinamen rekursiv(!) Linux-konform von Leerzeichen sowie Unterstrichen bereinigen.
Leerzeichen und Unterstriche sind Linux-konform.
Jaaa, okay... hast ja Recht ^^ Hab mich falsch ausgedrück, aber ich denke mal ihr wisst was gemeint ist. Leerzeichen bereiten ja leider immer wieder Probleme bei Linux, besonders in der Shell. So jedenfalls meine Erfahrung... whatever...
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
killercorny schrieb:
rklm schrieb:
Leerzeichen und Unterstriche sind Linux-konform.
Jaaa, okay... hast ja Recht ^^ Hab mich falsch ausgedrück, aber ich denke mal ihr wisst was gemeint ist. Leerzeichen bereiten ja leider immer wieder Probleme bei Linux, besonders in der Shell. So jedenfalls meine Erfahrung... whatever...
Die Shell kann wunderbar mit Dateinamen umgehen, die Leer- und andere Zeichen enthalten. Probleme gibt es immer dann, wenn Variablen nicht korrekt gequotet werden.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
rklm schrieb: Die Shell kann wunderbar mit Dateinamen umgehen, die Leer- und andere Zeichen enthalten. Probleme gibt es immer dann, wenn Variablen nicht korrekt gequotet werden.
Da die Shell nicht selbst quotet sondern der User das tun muss, hat killercorny Recht: Man kann sich die Arbeit stark vereinfachen, wenn man Leerzeichen und ähnlichen Klump aus Dateinamen eliminiert. Man muss dann nicht jeden Pup quoten.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
user_unknown schrieb:
Da die Shell nicht selbst quotet sondern der User das tun muss, hat killercorny Recht: Man kann sich die Arbeit stark vereinfachen, wenn man Leerzeichen und ähnlichen Klump aus Dateinamen eliminiert. Man muss dann nicht jeden Pup quoten.
Ich habe keine Lust diese Diskussion wieder zu führen. Du hast Deine Meinung, ich sehe das anders.
|