Subdirs und Dateien umbenennen/verschieben

Patrick Willam p.willam at gmx.de
Thu Aug 4 12:30:27 CEST 2005


Siegfried Peter schrieb:
> Bin langsam am verzweifeln.
> Meine Kinder legen auf dem Server in ihren homedirs in einem
> bestimmten dir subdirs mit *.mp3's für ihre MP3Player ab.
> Die Namen enthalten leider einige Schweinerein (Unlaute,
> Leerzeichen  usw) gibt es eine Möglichkeit alle Namen in kleinschreibung
> umzuwandeln und die Schweinereien zu entfernen?

Falls diese Ablage per Samba stattfindet, dann gibt es dort (bei
Samba) die Moeglichkeit, die Umlaut- bzw. Zeichensatzkonversion
zu beeinflussen, so dass dann ein Windows-Umlaut zum passenden
lokalen Linux-Umlaut im Dateisystem wird, ...und umgekehrt.
(Fuer konkrete Vorschlaege fuer smb.conf-Optionen muesste man dann
allerdings erstmal die Windows- und Samba-Versionen wissen.
Im Zweifelsfall auch die Lokalisierung der jeweiligen Systeme.)

> Ich habe schon folgendes Script probiert:
> 
> #!/bin/bash
> for i in *; do
>  mv "$i" $(echo "$i" | sed 's/ - /-/g');
<snip />
> done
> exit 0
> 
> leider arbeitet es nicht rekursiv.
> Kann mir jemand helfen?

Fuege vor der Schleife noch folgendes ein:
	# In ein Verzeichnis wechseln, falls es angegeben und schreibbar ist
	[[ "$1" && -d "$1" && -w "$1" ]] && cd "$1"

Und dann lasst du find die Arbeit machen:
	$ find /dein/bestimmtes/dir -type d -exec dein_skript.sh \{} \;
Sucht unter dir alle Verzeichnisse und ruft fuer jedes das Skript auf, mit
dem gefundenen [Verzeichnis]namen als erstes Argument.

Mit ".... -type d -print -exec ...." kriegst du auch noch jedes
Verzeichnis vor der Bearbeitung aufgelistet.

Uebrigens dein Skript nimmt im Endeffekt nur jeweils *eine* Namensaenderung
vor, d.h. es ersetzt *nicht* (bitte Umlaute denken...) ae *und* oe!

<alt>
for i in *; do
  mv "$i" $(echo "$i" | sed 's/ - /-/g');
  mv "$i" $(echo "$i" | sed 's/@/at/g');
  .....
done
</alt>

<neu type=08-15>
for alter_name in *; do
  neuer_name="$alter_name"
  neuer_name=$(echo "$neuer_name" | sed 's/ - /-/g');
  neuer_name=$(echo "$neuer_name" | sed 's/@/at/g');
  .....
  mv "$alter_name" "$neuer_name"
done
</neu>

...oder wer es etwas anders und schlanker schreiben mag

<neu type=schlank>
for alter_name in *; do
   neuer_name=$(echo "$alter_name" \
     | sed 's/ - /-/g' \
     | sed 's/@/at/g' \
     .....
   )
  mv "$alter_name" "$neuer_name"
done
<neu>

HTH und beste Gruesse,
   Patrick

-- 
nice things to slip into your budget: tab-completion @ password prompt
     -- Patrick Willam




More information about the Linux mailing list