prejmenovani souboru od specialnich znaku

Jirka Kosina jikos na jikos.cz
Pátek Duben 18 23:00:17 CEST 2003


On Fri, 18 Apr 2003, Michal Kubecek wrote:

> > for i in *; do
> > 	NEWNAME=`echo $i | sed 's/[^a-z^A-Z^0-9^.^_^-]/_/g'
> > 	/bin/mv mv $i $NEWNAME
> > done
>   - tohle prohledává jen jeden adresář, místo * tedy `find . -type f`

OK, bylo to pro puvodniho tazatele jen pro inspiraci. :) Takze:

Muzete misto for i in * dat for i in `find -type f`.

>   - co když má soubor jméno zapsané jen přípustnými znaky?

To vadi? mv si pravdepodobne asi bude stezovat, ale pozadovany vysledek
bude spravny.

>   - co když už v témže adresáři existuje jiný soubor s novým jménem?

if [ -e "$NEWNAME" ]; then
#tady si provedte nejakou akci kterou chcete v pripade kolidujicich jmen
	echo "Soubor $NEWNAME jiz existuje"
fi

>   - co když je těch souborů moc?

Pokud to zkusite, a Vas shell nezkousne prilis moc parametru pro for
cyklus, tak budete muset pouzit spis neco jako

find . -type f -exec /muj/skript.sh {} \;

kde soubor /muj/skript.sh provede pro prvni parametr jeho prejmenovani na
"spravne" jmeno, tedy neco na zpusob vyse uvedeneho skriptu, kde
prejmenovavany soubor nebude $i, ale $1 + dalsi upravy zminovane v tomto
mailu.

(+ muzete zvazit misto -exec pouzit xargs, v kombinaci se spravnymi
parametry findu (-print0))

>   - co když je ve jménu souboru mezera?

Ano, uzavirat promenne do uvozovek by se rozhodne melo.

>   - v závislosti na nastavení riskujete, že ze znaků s diakritikou
>     odstraníte pouze "ž" a "Ž"

Ano, a pred spustenim tedy jeste eventuelne nastavte LC_COLLATE na "C"
nebo "POSIX", abyste nemel vsunuta ceske znaky do rozsahu [a-zA-Z]

--
JiKos.


Další informace o konferenci Linux