Portál AbcLinuxu, 16. července 2025 06:12


Dotaz: Skript pro změnu *.php na *.htm

10.5.2003 21:28 Lukáš MATELA | skóre: 16
Skript pro změnu *.php na *.htm
Přečteno: 131×
Odpovědět | Admin
Potřeboval bych v adresáři a v celém stromu změnit soubory *.php na *htm.
V adresáři a stromu jsou ale i soubory *.htm a *jpg.
mv a ani rename neumí přepínač recursive.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

10.5.2003 22:39 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Skript pro změnu *.php na *.htm
Odpovědět | | Sbalit | Link | Blokovat | Admin
nevím, čemu to chceš -- není lepší úprava kofiguráku apache? ;) ale ok:
find . | perl -nle 'chomp;$o=$_;rename$o,$_ if s/\.php$/.htm/;'
11.5.2003 00:03 i__n
Rozbalit Rozbalit vše Skript pro zmenu *.php na *.htm
Odpovědět | | Sbalit | Link | Blokovat | Admin
a pokud nemate perl, tak:
#!/bin/bash
for file in *.php;
do
mv $file ${file%*php}htm
done
11.5.2003 00:06 i__n
Rozbalit Rozbalit vše Skript pro zmenu *.php na *.htm
a pokud chcete bla.php na blahtm, tak zmenit telo na
mv $file ${file%*.php}htm
ta tecicka tam .)
11.5.2003 01:51 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Skript pro zmenu *.php na *.htm
to asi nebude fungovat rekurzivně v celém stromu ;) nehledě na to, že to zhavaruje při každém druhém speciálním znaku v názvu souboru (stačí i mezera ;) a on někdo nemá perl? :)
11.5.2003 02:22 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Skript pro zmenu *.php na *.htm
pokud někdo nemá perl (to -type f by se asi mělo dát findu i v předchozí verzi):
find . -type f | sed 's/[`"$\\]/\\\0/g;s/\(.*\)\.php$/mv "\0" "\1.html"/;t;d' | sh
pokud máš v názvech souborů opravdu hodně divné znaky (např. \n), tak tahle varianta neprojde, ale normální divné znaky to oescapuje... a je to samozřejmě o dost pomalejší než ten perl, pokud souborů není jen pár...
11.5.2003 12:09 i__n
Rozbalit Rozbalit vše Skript pro zmenu *.php na *.htm
pardon, nevsiml jsem si toho pozadavku na rekurzi, takze tady je shellovy skript, ktery je rekurzivni a stoprocentni i na divne znaky vseho druhu ;) :
#!/bin/bash
fce()
{
for file in $1/*;
do
[ "$file" = "$1" ] && continue
[ -d "$file" ] && {
fce $file
continue
}

[ "${file##*.}" = "php" ] && { mv "$file" "${file%*php}htm"
echo " ...OK"
}
done
}

fce .
11.5.2003 13:04 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Skript pro zmenu *.php na *.htm
je vidět, že jsi to na divných znacích nezkoušel. stačí, aby se v názvu adresáře objevila mezera, a zhavaruje to. na dvou místech ;) nehledá to v tečkovaných adresářích, test [ "$file" = "$1" ] && continue je zcela obskurní, nastav raději nullglob, ... ale hlavně proč proboha? find + perl => 2 procesy, vysoká blbuvzdornost find + sed + sh/mv => 3 + n procesů, slušná blbuvzdornost skript v shellu => 1 + n procesů (nejspíš), blbuvzdornost špatná resp. obtížně dosažitelná když chci něco udělat rekusivně se soubory, použiju vždycky find (pokud to nějaký program neumí sám o sobě, jako např. grep) a když můžu, tak společně s xargs (tady to zrovna nějak moc skvěle nejde). i kdybych to perlové nebo sedové řešení napsal pěkně s mezerami, konci řádků a komentáři, bude to kratší a čitelnější než skript v bashi... ostatně, šlo by to udělat i čistě v perlu... perl -e 'use File::Find; finddepth(sub {$o=$_; rename $o,$_ if -f and s/\.php$/.html/}, ".");'
11.5.2003 13:30 i__n
Rozbalit Rozbalit vše Skript pro zmenu *.php na *.htm
;), hledisko vykonnosti a toho,ze to neleze do oteckovanych adresaru a adresaru s mezerou jsou nepodstatne...
v 1.pripade: to je dnes uplne suma fuk jestli to trva 5 nebo 15 sekund..
v 2.pripade.. to by byl fakt vul, kdyby to mel v oteckovanych adresarich nebo adresarich s mezerou... a kdyby nahodou mel, staci rict, poupravim ---> :)
11.5.2003 14:06 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Skript pro zmenu *.php na *.htm
mno, rozdíl v rychlosti může být klidně i dva řády, vím z vlastní zkušenosti... na adresářích s mezerou to chcípne, ne že by to do nich jen nevlezlo ;) ale podstata mého dotazu byla, proč to řešíš analyticky, když to jde řešit algebaricky. proč píšeš jakýsi skript, což je věc, která se musí napsat někam do souboru a ten pak pustit, když se to dá prostě napsat jako příkaz. etc.
11.5.2003 14:12 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Skript pro zmenu *.php na *.htm
jinak triky s ${...#...} a ${...%...} a rekursivní volání funkcí shellu nejsou podle mě pro nikoho srozumitelnější než
find | perl -nle '$old=$_; rename $old, $_ if s/\.php$/.htm/'
11.5.2003 18:08 Lukáš MATELA | skóre: 16
Rozbalit Rozbalit vše Skript pro zmenu *.php na *.htm
ad v 2.pripade .. Oteckovane adresare ani adresare s mezerou tam nemam.
A i kdybych mel, tak hned nemusim byt vul ;-).

Ale kazdopadne oboum moc dik za rady, hned to vyzkousim.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.