Ordner und Unterordner Leerziechen in "_" wandel?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
eimer
Beiträge: 77
Registriert: 09.11.2005 12:55:49
Wohnort: Endingen a.K.

Ordner und Unterordner Leerziechen in "_" wandel?

Beitrag von eimer » 10.09.2008 09:50:34

Hi Leute,
Ich würde gerne alle Leerzeichen ind Datei- /Ordnernamen in "_" umwandeln.
Hab dazu ein Script gefunden leider kunktioniert das nicht.
Meine Kenntnisse, warum es nicht funktioniert übersteigt das auch noch.

Vll. kann mir einer von euch helfen.

Code: Alles auswählen

#!/bin/bash
# rename files containing control characters and umlauts in their name
# (C) Reinhard Wobst, @(#) 7.Apr 17:38


typeset -i n


find . -print |
  while read fn
  do
    replace="$(echo -n "$fn" | tr '[\001-\040]' '[_*]')"


    replace="$(echo "$replace" |
	       sed -e 's-ä-ae-g' -e 's-ö-oe-g' -e 's-ü-ue-g' \
		   -e 's-Ä-Ae-g' -e 's-Ö-Oe-g' -e 's-Ü-Ue-g' \
		   -e 's-ß-ss-g'
	      )"


    [ "$replace" = "$fn" ] && continue


    [ -a "$replace" ] &&
      {
       n=0
       while [ -a "$replace$n" ] ; do let n+=1; done
       replace="$replace$n"
      }


    echo renaming \""$fn\"" to \""$replace\""
    mv "$fn" "$replace"
  done | cat -vt | tee ${1:-.deNTprot}
Ausgabe:

Code: Alles auswählen

renaming "./Peter_Lustig" to ""
renaming "./Peter_Lustig/Peter Lustig.txt" to ""
sed: -e Ausdruck #1, Zeichen 7: unterminated `s' command
mv: angegebenes Ziel ââ ist kein Verzeichnis: Datei oder Verzeichnis nicht gefunden
mfg eimer

Kommentare zum Code würden mir auch schon helfen.
Gi´me hope Juana.....

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Ordner und Unterordner Leerziechen in "_" wandel?

Beitrag von gms » 10.09.2008 12:57:47

eimer hat geschrieben: Kommentare zum Code würden mir auch schon helfen.
das Script hat mehrere Schwächen:
1) wenn ein Fehler passiert, dann versucht es Verzeichnisse oder Dateien in einen Leerstring zu "renamen", wie man hier sieht:

Code: Alles auswählen

renaming "./Peter_Lustig" to ""
dem könnte man einfach begegnen, wenn man folgende Zeile:

Code: Alles auswählen

[ -n "$replace" ] && continue
direkt vor oder nach dieser Zeile:

Code: Alles auswählen

[ "$replace" = "$fn" ] && continue
einfügt. Es wäre auch günstig, wenn hier noch zusätzlich eine Fehlermeldung mit dem Pfad zu der Datei oder dem Verzeichnis ausgegeben werden würde.

2) das Script benennt sowohl Verzeichnisse als auch Dateien um, beginnt aber oben in der Verzeichnishierarchie. Daher kann das so nicht funktionieren, wenn zuerst das übergeordnete Verzeichnis umbenannt wird, kommt es bei untergeordneten Verzichnissen oder Dateien zu Fehlern:

Code: Alles auswählen

gms2 test # mkdir "a b"
gms2 test # touch "a b/c d"
gms2 test # ./x.sh
mv: Aufruf von stat für „./a b/c d“ nicht möglich: Datei oder Verzeichnis nicht gefunden
renaming "./a b" to "./a_b"
renaming "./a b/c d" to "./a_b/c_d"
2) wie man bei obiger Ausgabe sieht, ist auch das Error-Handling dürftig. Die Fehlermeldung vom "mv" Kommando wird ungebuffert ausgegeben, die Statusanzeige "renaming ..." wird durch die Pipe erst später angezeigt. Daher sollte diese Zeile abgeändert werden, damit die Fehlermeldung nach der entsprechenden Statusanzeige ausgegeben wird:

Code: Alles auswählen

done 2>&1 | cat -vt | tee ${1:-.deNTprot}
hier noch eine Erklärung zu diesem Codestück:

Code: Alles auswählen

    [ -a "$replace" ] &&
      {
       n=0
       while [ -a "$replace$n" ] ; do let n+=1; done
       replace="$replace$n"
      }   
wenn eine Datei oder ein Verzeichnis unter dem neuen Namen schon existiert, wird hier nach einem eindeutigen Namen gesucht, daher es wird noch eine Zahl an den Namen angefügt.
eimer hat geschrieben: Ich würde gerne alle Leerzeichen ind Datei- /Ordnernamen in "_" umwandeln.
dafür gibt es wahrscheinlich geeignetere Tools im Debian-Repository, wovon ich allerdings auch nur "qmv" aus "renameutils" kenne

Gruß
gms

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: Ordner und Unterordner Leerziechen in "_" wandel?

Beitrag von roli » 10.09.2008 16:16:44

Hi,

was auch gehen muesste waere einfach mmv (mehrfach) zu verwenden:
mmv "* *" "$1_$2"
ACHTUNG, schau nochmal die Syntax nach, ich habe gerade kein Manual zu Hand und bin mir auch absolut nicht sicher ob's exakt so ist.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
hupfdule
Beiträge: 1864
Registriert: 09.12.2002 15:04:37
Wohnort: Berlin
Kontaktdaten:

Re: Ordner und Unterordner Leerziechen in "_" wandel?

Beitrag von hupfdule » 10.09.2008 17:10:53

Im Paket Debianperl gibt es das Tool prename, mit dem du Umbenennen kannst. Das wird standardmäßig auch unter dem Namen rename bereitgestellt.

Zum Ersetzen von Leerzeichen benutzt du:

Code: Alles auswählen

rename 's/\ /_/g' *
Um das ganze rekursiv zu machen, benutze zum Bsp. find.

Antworten