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