Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: Rautamiekka - 18.09.09 - klo:03.35

Otsikko: Tietyn tekstinpätkän löytäminen ja auto-muuttaminen toiseen, nimissä ja filuissa
Kirjoitti: Rautamiekka - 18.09.09 - klo:03.35
Ongelmana on siis että minulla on yli 100 tiedostoa joiden nimessä ja tekstissä on täsmälleen
Koodia: [Valitse]
GlobalBanjoka Linuxilla ei ole hyvä asia joka tuli jo testattua kun peliservu heitti erroria, joten on pakko muuttaa se muotoon
Koodia: [Valitse]
globalban
Otsikko: Vs: Tietyn tekstinpätkän löytäminen ja auto-muuttaminen toiseen, nimissä ja filu
Kirjoitti: snifi - 18.09.09 - klo:15.04
Lyhyin tapa on tehdä tuo bashilla, mutta itse tekisin sen Pythonilla:
Koodia: [Valitse]
import os

directory="./dump"
#base,newbase=("svgdump","SvgDump")
newbase,base=("svgdump","SvgDump")

files = os.listdir(directory)
for f in files:
  oldname=os.path.join(directory,f)
  newname=oldname.replace(base,newbase)
  if oldname!=newname:
    #print oldname,newname
    os.rename(oldname,newname)

Kokeilin tuota dump-hakemistoon, jossa oli erinäinen määrä svgdumpxxx.svg nimisiä tiedostoja. Voit kokeilla ensin että tiedostonnimet menevät oikein vaihtamalla kommentin paikkaa edellisestä:
Koodia: [Valitse]
    print oldname,newname
    #os.rename(oldname,newname)
Otsikko: Vs: Tietyn tekstinpätkän löytäminen ja auto-muuttaminen toiseen, nimissä ja filu
Kirjoitti: snifi - 18.09.09 - klo:17.09
...ja ehkä tässä tapauksessa voisi olla viisaampi käyttää lower()-funktiota merkkijonon muuntamiseen pieniksi kirjaimiksi, testaamattomana koodina jotenkin näin:

Koodia: [Valitse]
import os

directory="."
for oldname in os.listdir(directory):
  newname=oldname.lower()
  if newname!=oldname:
    oldname=os.path.join(directory,oldname)
    newname=os.path.join(directory,newname)
    print oldname,newname
    #os.rename(oldname,newname)
Otsikko: Vs: Tietyn tekstinpätkän löytäminen ja auto-muuttaminen toiseen, nimissä ja filuissa
Kirjoitti: tomageeni - 19.09.09 - klo:02.06
Komentorivillä menee suoraan näin:
Koodia: [Valitse]
for i in * ; do sed -e 's/GlobalBan/globalban/g' $i > `echo $i|sed -e 's/GlobalBan/globalban/g' `  ; done

Ko. komentosarjaskripti pitää siis suorittaa samassa hakemistossa missä tiedostot ovat. Huomaa että tämä komento käy läpi hakemiston jokaisen tiedoston, jos haluat tehdä muutoksen esimerkiksi vain kaikkiin .txt -tiedostoihin niin korvaa tuo alku muotoon
Koodia: [Valitse]
for i in *.txt ; ....

Tässä ei myöskään korvata alkuperäisiä tiedostoja vaan tehdään uudet tiedostot uusilla tiedostonimillä.
Jos esimerkiksi hakemistossa on tiedostot GlobalBan1.txt, GlobalBan2.txt ... GlobalBan100.txt, näitä ei poisteta (eikä niihin kosketa) vaan tehdään kaveriksi tiedostot globalban1.txt, globalban2.txt.... joiden sisällössä on myös nuo GlobalBan-kohdat korvattu pienillä kirjaimilla.

edit. typofixejä