[ Jbyn4e @ 01.04.2009. 08:26 ] @
U skorije vreme sam morao na mailing list serveru koja svoju bazu cuva u flat file formatu (tj. u fajlovima) da promenim sve .yu u .rs, da ne bi korisnici bili isclanjeni zbog prestanka rada .yu domena. To se relativno lako postize, ali sam pomislio da ce nekome trebati ili biti korisno, pa evo kako se to radi.
Prvo, rec je o ecartis mailing list serveru koji korisnike drzi u fajlovima naziva users u direktorijumu po nazivu liste ime_liste, tj. fajl je oblika ime_liste/users. Jednostavan skript koji to radi, a pokrenut je u tom korenom direktorijumu listi je:

for i in `find . -name 'users'| sed 's_\./__g'`;
do
sed 's/\.yu/\.rs/g' $i > $i.rs
mv $i.rs $i
done

Objasnjenje skripta:
za svaki "i" koji zadovoljava da se nasao u obliku ime_direktorijuma/users (find ce naci oblika ./ime_dir/users, a sed mu skida to ./, mada mu verovatno ne smeta, vise volim kad je preglednije)
uradi
zameni sed-om .yu u .rs, smesti u fajl users.rs
pomeri users.rs u users
zavrsi sa radom.

Nadam se da ce nekome biti korisno.

P.S. koriscenje separatora kod sed-a nije ograniceno na /, vec moze i _ (pretpostavljam i jos neki, ali mi nikad nije trebalo), pa je u primeru gore upotrebljen jednom jedan a drugi put drugi cisto primera radi.


[Ovu poruku je menjao Jbyn4e dana 01.04.2009. u 13:17 GMT+1]
[ momsab @ 01.04.2009. 11:36 ] @
problemi kod ove zamene su sledeci, ako nisu u pitanju adrese kod domacih provajdera: dosta domena niej prebaceno sa yu na rs, i neki co.yu su prebaceni rs a ne i na co.rs

dobra skripta :)
[ Jbyn4e @ 02.04.2009. 11:41 ] @
"Malo" izmenjena skripta (koja nije testirana na pravim fajlovima jos) , koja uzima u ubzir da je mozda doslo do prelaska sa co.yu ili org.yu na .rs, ako ne postoji .co.rs, bi izgledala nekako ovako (komentari su dati u primeru):


for fajl in `find . -name 'users*'| sed 's_\./__g'`;
do
#zameni sve .yu u .rs
fajlrs=${fajl}.rs
sed 's/\.yu/\.rs/g' $fajl > $fajlrs
#pronadji da li u fajlrs ima neispravnih adresa
while read linija
do
echo "fajl: "$fajl
# obrisi sve sto ima iza mail adrese (u liniji konfiguracionog fajla mailing list servera)
i=`echo $linija|sed 's/ : |.*//g'`
#nadji domen pod pretpostavkom da ima samo jedno @
# otkomentarisi sledece ako zelis da vidis kako izgleda linija
# echo "linija "$i
domen=`echo $i|sed 's/^.*@//g'`;
#nadji username, pod pretpostavkom da ima samo jedno @
username=`echo $i|sed 's/@.*$//g'`;
#nadji da li ima MX record u DNS-u za njega
imamx=`host -t mx $domen| grep -v 'is handled'|sed 's/ //g'`;
# ako nema domena
# otkomentarisi sledece ako hoces da ti ispisuje kod svakog
#echo "user: "$username" domen: "$domen" imamx: "$imamx
if [ x${imamx} != x ];
then
#proveri da li je presao sa co.rs ili org.rs na .rs
domen1=`echo $domen| sed 's/\.co\.rs/\.rs/g;s/\.org\.rs/\.rs/g'`;
imamx1=`host -t mx $domen1| grep -v 'is handled'|sed 's/ //g'`;
# trazimo da li se u odzivu host naredbe za MX domena javlja is handled. Ako se javlja - MX record postoji
#ako nije presao ni na .rs
if [ x${imamx1} != x ];
then
# nema ni domen .rs, treba ga spremiti u nepostojece koje treba brisati ili ostaviti kao .yu
echo $i>>neispravni.txt1
else
#presao je na .rs, nema co.rs ili org.rs
# $domen1 je dobar, treba zameniti u liniji co.rs ili org.rs sa .rs
echo $linija|sed 's/\.co\.rs/\.rs/g;s/\.org\.rs/\.rs/g'>>${fajlrs}.dobar
fi;
else
# ima mx zapis, domen je dobar i e-mail je dobar (sto ne znaci da postoji na domenu)
echo $linija>>${fajlrs}.dobar;
fi;
done < $fajlrs
#ciscenje na kraju, obrisi pomocni $fajlrs i pomeri dobre u stari users fajl
rm -f $fajlrs
mv ${fajlrs}.dobar $fajl
done


Ima li nekih sugestija kako bi se to jos moglo odraditi?
[ Mister Big Time @ 07.12.2010. 23:19 ] @
Ja ovo radim na MySQL bazi, shvatih da je malo komplikovanije nego sto sam mislio iz razloga koji je naveo momsab...

Pa sam mislio da napravim posebno upit za svakog provajdera tipa:
eunet.yu -> eunet.rs
dakle ono u sta sam 100% siguran a onda ono sto ostane tipa perinafirmica.co.yu da samo bacim izmenu umesto .yu na .rs pa sta Bog da, i tako su ti korisnici vec otpisani jer nisu sami azurirali emailove...

Upit:

Code:
SELECT *
FROM `nazivbaze_members`
WHERE `emailAddress` LIKE '%.yu'


mi je vratio sve sa .yu zavrsetkom.

Kako najbezbolnije izvesti operaciju izmene, any suggestions?

sad vidim ima i ovih koji su skroz mrtvi tipa @deltabanka.co.yu (promena na bancaintesa . nesto...) ili @afrodita.rcub.bg.ac.yu (pitaj Boga...) @jp.ptt.yu, @scnet.yu ili @net.yu ... itd.

Koje su posledice (kre)debilne tranzicije sa yu na rs jos uvek se oseca... xD


Code:



UPDATE `dbmirror`.`korisnici` SET `emailAddress` = '%eunet.rs' WHERE `korisnici`.`emailAddress` LIKE '%eunet.yu'



^ radi ali zahebe username tj. sve ispred znaka %

Kako napraviti sintaksu koja ce sve pre % da sacuva tj. da ne dira?




[Ovu poruku je menjao Mister Big Time dana 08.12.2010. u 02:27 GMT+1]
[ Jbyn4e @ 08.12.2010. 07:04 ] @
Nisam probao, ali verovatno bi trebalo da upotrebis neku od string funkcija mysql-a, npr. replace, primer sa
http://dev.mysql.com/doc/refma...unctions.html#function_replace
Code:

mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
        -> 'WwWwWw.mysql.com'



Odnosno upotrebis nesto u stilu:
Code:

update TABLE_NAME set FIELD_NAME = replace(FIELD_NAME, ‘find this string’, ‘replace found string with this string’);

update client_table set company_name = replace(company_name, ‘Old Company’, ‘New Company’);

Preuzeto sa
http://www.mydigitallife.info/...t-in-mysql-database-using-sql/

P.S. Drugi nacin je da uradis export baze u sql fajl, primenis neku od gornjih skripti koje sam pisao (samo izmenjenu za tvoje potrebe) i dalje importujes nazad bazu...
[ Mister Big Time @ 12.12.2010. 11:05 ] @
Hvala Jbyn4e,
nisam stigao da se pozabavim ovim problemom, probacu danas...