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