Leerzeichen aus Filenamen
Hallo, ich kriege es nicht hin (auch nicht mit Google). Ich wollte ein bash-Befehl, der mir bei allen Dateien eines Verzeichnisses die Leerzeichen im Filenamen durch Unterstrich ersetzt. Wie geht das? Gruß Johannes -- 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
Guten Abend, Johannes Reese schrieb:
ich kriege es nicht hin (auch nicht mit Google). Ich wollte ein bash-Befehl, der mir bei allen Dateien eines Verzeichnisses die Leerzeichen im Filenamen durch Unterstrich ersetzt. Wie geht das?
Vielleicht so: for i in *\ *; do mv "$i" $(echo "$i" | sed 's/\ /_/g'); done Gruß, Kimmo -- 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
Hallo, Am Mit, 11 Feb 2009, Johannes Reese schrieb:
ich kriege es nicht hin (auch nicht mit Google). Ich wollte ein bash-Befehl, der mir bei allen Dateien eines Verzeichnisses die Leerzeichen im Filenamen durch Unterstrich ersetzt. Wie geht das?
while mmv '* *' '#1_#2'; do :; done HTH, -dnh -- THE LESSER-KNOWN PROGRAMMING LANGUAGES #12: LITHP This otherwise unremarkable language is distinguished by the absence of an "S" in its character set; users must substitute "TH". LITHP ith thaid to be utheful in protheththing lithtth. -- BSD fortune file [modified] -- 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
David Haller schrieb:
Hallo,
...
der mir bei allen Dateien eines Verzeichnisses die Leerzeichen im Filenamen durch Unterstrich ersetzt. Wie geht das?
while mmv '* *' '#1_#2'; do :; done
ich will ja jetzt nicht klugsch... hier, aber "mmv" sollte doch bestimmt "mv" heißen, oder? By the way: "do :; done" ? Ist hier der Doppelpunkt der Null, oder Leeroperator? Er macht einfach nichts und läuft so lange durch die Schleife, bis alle "mv"'s im Header abgearbeitet sind? Danke + Gruß Axel -- 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
Hallo, Am Mit, 11 Feb 2009, Axel Birndt schrieb:
David Haller schrieb: ...
der mir bei allen Dateien eines Verzeichnisses die Leerzeichen im Filenamen durch Unterstrich ersetzt. Wie geht das?
while mmv '* *' '#1_#2'; do :; done
ich will ja jetzt nicht klugsch... hier, aber "mmv" sollte doch bestimmt "mv" heißen, oder?
Nein. 'mmv' = "multiple move'. Das verwendet die auf die Wildcards Teile des Dateinamens aus der Quelle anstelle von #1 ... im Ziel.
By the way: "do :; done" ? Ist hier der Doppelpunkt der Null, oder Leeroperator? Er macht einfach nichts und läuft so lange durch die Schleife, bis alle "mv"'s im Header abgearbeitet sind?
mmv liefert '0' (also wahr) als exit-code, solange es umbenennen kann. Findet es keine Dateien mit Leerzeichen mehr liefert es 1 (false) und die Schleife wird beendet. Einfach mal mit 'while mmv -v ...' aufrufen. Das ist zwar nicht die effektivste Methode, die Dateien werden mehrfach umbenannt, das dürfte aber weitgehend im Dateisystemcache stattfinden, falls es nicht gar zu viele Dateien sind. Und es wird jew. nur 1 mmv pro Schleifendurchlauf aufgerufen, d.h. die Schleife läuft so oft wie die maximale Anzahl Leerzeichen in einem der Dateinamen. Die "traditionelle" Schleife über die Dateien und das Verwenden von sed für die Zeichenersetzung ist aufwendiger. $ ls *\ * | wc -l 4004 $ time while mmv '* *' '#1_#2'; do :; done * * -> #1_#2 : no match. Nothing done. real 0m12.742s user 0m0.170s sys 0m12.540s $ while mmv '*_*' '#1 #2' ; do :; done [..] $ time for f in *\ *; do t="$(echo "$f" | sed 's/ /_/g')"; \ mv -i "$f" "$t"; done real 1m12.958s user 0m22.780s sys 0m48.970s $ while mmv '*_*' '#1 #2' ; do :; done [..] $ time for f in *\ *; do t="${f// /_}"; mv -i "$f" "$t"; done real 0m33.735s user 0m11.080s sys 0m21.910s Da sieht man, wie "teuer" das aufrufen des "mv" bzw. sed ist. Bzw. wie günstig meine "abwegige" Variante mit dem mehrfachen umbenennen einer Datei (je einmal pro Leerzeichen) per mmv ist ;) HTH, -dnh -- Ich habe festgestellt, wenn man die Finger in die Ohren steckt und laut summt löst das eine ganze Menge von Problemen. -- Brig. Gen. Jack O'Neill -- 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
Hallo, David Haller schrieb:
Hallo,
Am Mit, 11 Feb 2009, Johannes Reese schrieb:
ich kriege es nicht hin (auch nicht mit Google). Ich wollte ein bash-Befehl, der mir bei allen Dateien eines Verzeichnisses die Leerzeichen im Filenamen durch Unterstrich ersetzt. Wie geht das?
while mmv '* *' '#1_#2'; do :; done
Das ersetzt doch nur das erste Leerzeichen, oder? Ich denke, Johannes wollte _alle_ Leerzeichen durch '_' ersetzen. Gruß Kimmo -- 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
Hallo, Am Don, 12 Feb 2009, K. Elo schrieb:
David Haller schrieb: [..]
while mmv '* *' '#1_#2'; do :; done
Das ersetzt doch nur das erste Leerzeichen, oder? Ich denke, Johannes wollte _alle_ Leerzeichen durch '_' ersetzen.
Rat mal, was das 'while' dabei soll... (siehe auch nebenan) -dnh -- "Wenn mer die Linke an der Macht beteiligt, flüchtet das bürgerliche Kapital ins Ausland." "Des glaub isch ned, des is doch scho fott." -- Neues a. d. Anstalt -- 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
Hallo! Am 12.02.2009 um 08:32 Uhr schrieb K. Elo:
[...]
Hattet ihr das schon? (Im Netz als blank2underline.sh gefunden) <code> #!/bin/bash find . -iname '* *' | while read f do mv "$f" "`echo "$f" | sed 's/ */_/g'`" done </code> cu Peter -- 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
Hallo, Am Don, 12 Feb 2009, Peter Geerds schrieb:
Am 12.02.2009 um 08:32 Uhr schrieb K. Elo:
[...] Hattet ihr das schon? (Im Netz als blank2underline.sh gefunden)
Erste Antwort, von K. Elo. Lies auch die Kritik von mir daran. Liest du den Thread auf den du antwortest nicht? -dnh -- Connection reset by beer -- 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
Hi David! On Thu, 12 Feb 2009, David Haller wrote:
Hallo,
Am Don, 12 Feb 2009, Peter Geerds schrieb:
Am 12.02.2009 um 08:32 Uhr schrieb K. Elo:
[...] Hattet ihr das schon? (Im Netz als blank2underline.sh gefunden)
Erste Antwort, von K. Elo. Lies auch die Kritik von mir daran.
Liest du den Thread auf den du antwortest nicht?
Naja, er sucht halt rekursiv nach Dateien mit Leerzeichen und benennt die um. Das ist schon ein Unterschied. Aber du hast recht, es ist nicht sonderlich elegant, nicht robust (verträgt keine seltsamen Dateinamen) und sonderlich performant ist es auch nicht (sed-Aufruf anstelle von Parameter Expansion). Das kann natürlich auch schief gehen. Mit freundlichen Grüßen Christian -- hundred-and-one symptoms of being an internet addict: 113. You are asked about a bus schedule, you wonder if it is 16 or 32 bits. -- 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
Halle David! Am 12.02.2009 um 17:11 Uhr schrieb David Haller:
Liest du den Thread auf den du antwortest nicht?
Was soll ich jetzt darauf antworten? Ja, ich lese ihn (sonst hätte ich auch gar nicht antworten können ;-) ). Nein, weil ich mir bei einem Mailaufkommen von über 100 pro Tag nicht alle der letzten paar Tage merken kann (und auch nicht immer nachschaue, was alles schon geschrieben wurde). cu Peter -- 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
Hallo, danke für die vielen Antworten! Ich habe Kimmos Lösung benutzt: for i in *\ *; do mv "$i" $(echo "$i" | sed 's/\ /_/g'); done Hat best funktioniert. Viele Grüße Johannes -- 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
Hallo, Am Fre, 13 Feb 2009, Johannes Reese schrieb:
danke für die vielen Antworten!
Ich habe Kimmos Lösung benutzt:
for i in *\ *; do mv "$i" $(echo "$i" | sed 's/\ /_/g'); done
Hat best funktioniert.
Du hast mitbekommen, daß du dir damit Dateien überschreiben kannst? Du solltest unbedingt 'mv -i' statt 'mv' verwenden! -dnh -- Die Signatur will nicht angezeigt werden. Die gewuenschte Signatur ist zur Zeit nicht verfuegbar. Moeglicherweise ist sie gerade im Urlaub oder hat einfach keine Lust angezeigt zu werden. Oder wollen Sie staendig beobachtet werden? -- 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
Am Freitag, 13. Februar 2009 19:59:58 schrieb David Haller:
Du hast mitbekommen, daß du dir damit Dateien überschreiben kannst?
Du solltest unbedingt 'mv -i' statt 'mv' verwenden!
Zu spät, aber danke für den Tip! Ich habe aber sowieso die Dateien in ein Extra-Verzeichnis gepackt vorher, verloren ist also nichts. Viele Grüße Johannes -- 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
Am Mi Februar 11 2009 20:18 schrieb Johannes Reese:
Hallo,
ich kriege es nicht hin (auch nicht mit Google). Ich wollte ein bash-Befehl, der mir bei allen Dateien eines Verzeichnisses die Leerzeichen im Filenamen durch Unterstrich ersetzt. Wie geht das?
Gruß
Johannes
Hallo, mit dem angehängten Perl-Script (war mal in dem Perl-Kamel-Buch gestanden) kannst Du reguläre Ausdrücke auf Filenamen anwenden! z.B. ren 's/ //' *.txt ersetzt alle ' ' durch nichts, löscht sie also! Grüße Mike
Hallo, Am Mit, 11 Feb 2009, Mike Philipp schrieb:
mit dem angehängten Perl-Script (war mal in dem Perl-Kamel-Buch gestanden) kannst Du reguläre Ausdrücke auf Filenamen anwenden! z.B. ren 's/ //' *.txt ersetzt alle ' ' durch nichts, löscht sie also!
[..] for (@ARGV) { $file = $_; eval $op; [..] *WEIA* Kein '-w', kein Taint-mode, kein 'use strict;'. Mach das nicht mit: ren 'system("remove_really_fast -rf /");' foo Das Script bitte _GANZ SCHNELL_ löschen / vergessen. Ansonsten kann man mit Perl durchaus praktisch Dateien umbenennen. -dnh -- Perl. Die einzige interpretierte Sprache, wo alle Programme Closed Source sind, weil es keiner lesen kann. -- Till Potinius -- 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
On 11.02.2009, Mike Philipp wrote:
mit dem angehängten Perl-Script (war mal in dem Perl-Kamel-Buch gestanden) kannst Du reguläre Ausdrücke auf Filenamen anwenden!
perl -e 'while($_=shift) { $dat=$_; rename $dat, $_ if s/\s+/_/g; }' * -- 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
Hallo, Am Mit, 11 Feb 2009, Heinz Diehl schrieb:
On 11.02.2009, Mike Philipp wrote:
mit dem angehängten Perl-Script (war mal in dem Perl-Kamel-Buch gestanden) kannst Du reguläre Ausdrücke auf Filenamen anwenden!
perl -e 'while($_=shift) { $dat=$_; rename $dat, $_ if s/\s+/_/g; }' *
Damit überschreibst du dir schon vorhandene Zieldateien (mmv macht das nicht, wenn man es nicht per Option dazu zwingt). perl -e 'for(@ARGV) { $orig=$_; s/\s+/_/g; unless( $_ ne $orig && -e $_ ) { rename($orig, $_); } }' *\ * Das ist dann mit 3.660s auch schneller als die mmv Lösung. Fehlerausgabe (Zieldatei existiert schon) bitte selber ergänzen. HTH, -dnh -- Windows 98? Warum? Ich hab' das alte noch nicht zu Ende gespielt. -- 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
On 12.02.2009, David Haller wrote:
perl -e 'while($_=shift) { $dat=$_; rename $dat, $_ if s/\s+/_/g; }' *
Damit überschreibst du dir schon vorhandene Zieldateien (mmv macht das nicht, wenn man es nicht per Option dazu zwingt).
Das stimmt aber so nicht. Hier vier Testdateien, alle zur gleichen Zeit erzeugt. liesel:/test # ls -l -rw-r--r-- 1 root root 0 Feb 12 17:23 test abc -rw-r--r-- 1 root root 0 Feb 12 17:23 test def -rw-r--r-- 1 root root 0 Feb 12 17:23 test1 -rw-r--r-- 1 root root 0 Feb 12 17:23 test2 Der Einzeiler ein paar Minuten spaeter, dann: liesel:/test # ls -lt --time=ctime -rw-r--r-- 1 root root 0 Feb 12 17:26 test_abc -rw-r--r-- 1 root root 0 Feb 12 17:26 test_def -rw-r--r-- 1 root root 0 Feb 12 17:23 test1 -rw-r--r-- 1 root root 0 Feb 12 17:23 test2 Jetzt ein Umbenennen einer der Dateien: liesel:/test # mv test1 test3 liesel:/test # ls -lt --time=ctime -rw-r--r-- 1 root root 0 Feb 12 17:30 test3 -rw-r--r-- 1 root root 0 Feb 12 17:26 test_abc -rw-r--r-- 1 root root 0 Feb 12 17:26 test_def -rw-r--r-- 1 root root 0 Feb 12 17:23 test2 -- 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
Hi Heinz! On Thu, 12 Feb 2009, Heinz Diehl wrote:
On 12.02.2009, David Haller wrote:
perl -e 'while($_=shift) { $dat=$_; rename $dat, $_ if s/\s+/_/g; }' *
Damit überschreibst du dir schon vorhandene Zieldateien (mmv macht das nicht, wenn man es nicht per Option dazu zwingt).
Das stimmt aber so nicht. Hier vier Testdateien, alle zur gleichen Zeit erzeugt.
Der Einzeiler ein paar Minuten spaeter, dann:
liesel:/test # ls -lt --time=ctime -rw-r--r-- 1 root root 0 Feb 12 17:26 test_abc -rw-r--r-- 1 root root 0 Feb 12 17:26 test_def -rw-r--r-- 1 root root 0 Feb 12 17:23 test1 -rw-r--r-- 1 root root 0 Feb 12 17:23 test2
Und was passiert, wenn du test_abc in "test def" umbenennst und Deinen Einzeiler nochmal laufen lässt? Ich denke darauf wollte David hinaus. Mit freundlichen Grüßen Christian -- hundred-and-one symptoms of being an internet addict: 112. You are amazed that anyone uses a phone without a modem on it...let alone hear actual voices. -- 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
On 12.02.2009, Christian Brabandt wrote:
Und was passiert, wenn du test_abc in "test def" umbenennst und Deinen Einzeiler nochmal laufen lässt? Ich denke darauf wollte David hinaus.
Ja, er hat Recht, ich habe ihn missverstanden. perl -e 'while($_=shift) { $dat=$_; rename $dat, $_ if s/\s+/_/g && ! -e $_; }' * -- 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
Hallo, Am Don, 12 Feb 2009, Heinz Diehl schrieb:
Das stimmt aber so nicht. Hier vier Testdateien, alle zur gleichen Zeit erzeugt.
liesel:/test # ls -l -rw-r--r-- 1 root root 0 Feb 12 17:23 test abc -rw-r--r-- 1 root root 0 Feb 12 17:23 test def
Ruf mal in nem leeren Testverzeichnis das folgende auf: $ for n in 'test abc' 'test def' 'test_abc'; do echo "$n" > "$n"; done Fällt dir was auf, nachdem du deinen Einzeiler hast laufen lassen? -dnh -- Every feature is a bug, unless it can be turned off. -- Karl Heuer -- 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
Hallo Johannes, Das Tastaturgeklapper von Johannes Reese, am 11.02.2009 20:18 lautete:
Hallo,
ich kriege es nicht hin (auch nicht mit Google). Ich wollte ein bash-Befehl, der mir bei allen Dateien eines Verzeichnisses die Leerzeichen im Filenamen durch Unterstrich ersetzt. Wie geht das?
Um saubere Linux-Dateinamen zu erhalten verwendet man am besten das Programm detox (siehe man detox) Es bearbeitet rekursiv alle Dateien samt Unterverzeichnisse in einem Ordner. Gruß Steffen -- 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
participants (9)
-
Axel Birndt
-
Christian Brabandt
-
David Haller
-
Heinz Diehl
-
Johannes Reese
-
K. Elo
-
Mike Philipp
-
Peter Geerds
-
Steffen Genkinger