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