Subdirs und Dateien umbenennen/verschieben
Jan 'RedBully' Seiffert
redbully at cc.fh-luh.de
Thu Aug 4 17:57:49 CEST 2005
Patrick Willam schrieb:
> 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"
>
[snip verbesserungen]
Bleibt noch das problem, wenn die Verseichnisse selber sowas enthalten
und man einen filter drauf anwendet. Loesung: wir rufen uns rekursiv
selbst auf (der erfahrene Programmierer plaziert noch einen Elefanten in
Kairo...) fuer jedes vorkommende Element, und bennenen es ggf. um, also
auch die Verzeichnisse.
--------------------
#! /usr/bin/env bash
SED_SCRIPT='s/ü/ue/g;s/ö/oe/g;s/ä/ae/g;s/ß/ss/g;s/@/_at_/g'
FILENAME_PATTERN='*.mp3 *.wav' # nach belieben mehr hinzufuegen
filter () {
local string="${1}"
local filtered_string=""
if [ -z "${string}" ] ; then
echo ""
return 0
fi
echo -n "${string}" |
tr [:space:] '_' |
tr [:upper:] [:lower:] |
sed -e "${SED_SCRIPT}" |
tr -s '_' '_'
return 0
}
if [ -z "${1}" ] ; then
echo "Achtung! Kein Pfad angegeben, suche ab hier: `pwd`"
echo "Sie haben 5 Sekunden um abzubrechen (CTRL-C)"
sleep 5
"${0}" "`pwd`"
exit 0
fi
while [ -n "${1}" ] ; do
given_path="${1}"
shift
filter_path=$(filter "${given_path}")
# wenn sich der name durchs filtern geaendert hat, umbenennen
if [ "${given_path}" != "${filter_path}" ] ; then
if [ -d "${filter_path}" ] ; then
echo "UIUIUI, ${filter_path} existiert schon, ueberspringe..."
continue
else
echo "Aus: ${given_path} -> ${filter_path}"
mv "${given_path}" "${filter_path}"
fi
fi
# wenn es ein verzeichniss ist, abtauchen
if [ -d "${filter_path}" ] ; then
# uns selbst mit den neuen verzeichnissen aufrufen
find "${filter_path}" -type d -mindepth 1 -maxdepth 1 -exec "${0}" "{}" \;
# alle Dateipattern durch gehen
for pattern in ${FILENAME_PATTERN} ; do
# uns selbst mit den gefundenen Dateinamen aufrufen
find "${filter_path}" -type f -mindepth 0 -maxdepth 1 -iname
"${pattern}" -exec "${0}" "{}" \;
done
fi
done
------------------------
vielleicht die mv erstmal durch echos ersetzen.
Irgendwie hab ich nur das Problem, das mein sed nicht so wirklich mit
Umlauten will, aber at und so ersetzt er...
Kannst dir ja auch noch ueberlegen, noch mehr Metacharacter in den
Filter aufzunehmen.
>
> HTH und beste Gruesse,
> Patrick
>
Gruss
Jan
--
Fachbegriffe der Informatik (#213): NT-Fernwartung
Microsoft Cordless Wheel Mouse
More information about the Linux
mailing list