Kirjoittaja Aihe: Tiedoston/kansion merkkien muuttaminen[Ratkaistu, kahdella tapaa]  (Luettu 4175 kertaa)

gdm

  • Sitä saa mitä tilaa...
  • Käyttäjä
  • Viestejä: 4363
    • Profiili
    • Keskustelualueiden säännöt
Eli, kyseessä mediakansion sisältö, Muutamassa kansiossa ja muutamassa tiedostossa on " & " merkki, joka pitäisi vaihtaa "and" sanaksi, sed onnistuu tehtävässä, mutta muutos ei säily.
muutokseen käytetty komento on;
Koodia: [Valitse]
sed 's/&/and/g'ja etsimiseen
Koodia: [Valitse]
find . \( -type d -or -type f \) -iname '*&*'

Huono puoli tuossa findissa on että pitäisi tietenkin määritellä tyypit, d kansioille ja f tiedostoille.

Ongelma on kuitenkin tuo sed, jonka muutos ei pysy??

Edit. muutettu etsimiskomento oikeaksi
Edit2. Lisäselvitystä

Vaikka putkittaa tuon find komennon tulosteen, ei mitään tapahdu.
Vaikka lisää findille -exec vivun ja suorittaa sitä kautta, mitään ei tapahdu.

Edit:
Ratkaisu 1:
Koodia: [Valitse]
find . -name '*&*' | rename 's/&/and/g'Etsii hakemiston sen alihakemistot läpi etsie kaikki "&" merkit ja muuttaa sen "and"

Ratkaisu 2:
Koodia: [Valitse]
find . -iname '*&*' | while read a; do j=`sed 's/&/and/g' <<<$a`; mv "$a" "$j"; doneTekee ihan saman.
« Viimeksi muokattu: 30.06.08 - klo:16.52 kirjoittanut GoddamnDevil »
Lisää [Ratkaistu] aloitusviestiin jos ongelmasi selviää!
Saamasi tuki on ilmaista, joten älä vaadi tai uhkaile saadaksesi apua!

janne

  • Käyttäjä
  • Viestejä: 5150
    • Profiili
Vs: Tiedoston/kansion merkkien muuttaminen
« Vastaus #1 : 29.06.08 - klo:18.36 »
Ongelma on kuitenkin tuo sed, jonka muutos ei pysy??

sed ei muokkaa tiedostoja vaan tulostaa muutokset jotka voi ohjata haluamaansa sijaintiin. jos muutksen haluaa tehdä suoraan käsiteltävään tiedostoon, pitää sedille varmaan antaa optio -i joka ottaa tiedostoista myös kopiot.
Janne

gdm

  • Sitä saa mitä tilaa...
  • Käyttäjä
  • Viestejä: 4363
    • Profiili
    • Keskustelualueiden säännöt
Vs: Tiedoston/kansion merkkien muuttaminen
« Vastaus #2 : 29.06.08 - klo:19.06 »
Ongelma on kuitenkin tuo sed, jonka muutos ei pysy??

sed ei muokkaa tiedostoja vaan tulostaa muutokset jotka voi ohjata haluamaansa sijaintiin. jos muutksen haluaa tehdä suoraan käsiteltävään tiedostoon, pitää sedille varmaan antaa optio -i joka ottaa tiedostoista myös kopiot.

Ok, oli pienenpieni väärinkäsitys tuon ohjelman toiminnasta.
Ei viitsi tuolla -i optiolla leikkiä, sillä silloin ne pitäisi myös poistaa.

http://forum.ubuntu-fi.org/index.php?topic=19483.msg144860#msg144860
Tuolta osui silmiin
Koodia: [Valitse]
for a in * ; do j=`echo $a | sed 's/\[//g' | sed 's/\]//g'`;mv "$a" "$j"; done;Tuon avullako voisi kansiot/tiedostot nimetä uudelleen? pienin muutoksin?

Itsetoimista kokeilua...
Tuon avulla onnistuu jollakin tapaa, eli pitää käyttää mv komentoa. eli pitää olla alkuperäinen tiedosto/kansio, joka nimetään toiseksi.
nyt etsitään vain oikea tapa tehdä tuo :)
Lisää [Ratkaistu] aloitusviestiin jos ongelmasi selviää!
Saamasi tuki on ilmaista, joten älä vaadi tai uhkaile saadaksesi apua!

janne

  • Käyttäjä
  • Viestejä: 5150
    • Profiili
Vs: Tiedoston/kansion merkkien muuttaminen
« Vastaus #3 : 29.06.08 - klo:19.35 »
Ok, oli pienenpieni väärinkäsitys tuon ohjelman toiminnasta.
Ei viitsi tuolla -i optiolla leikkiä, sillä silloin ne pitäisi myös poistaa.

jos -i:lle ei anna mitään parametria, niin varmuuskopioitakaan ei tehdä.
tuo väärinkäsitys on kyllä tosi yleinen :)

tosin väärinkäsitys oli minullakin, sillä jotenkin kuvittelin, että olit muokkaamassa tiedoston sisältöä.

http://forum.ubuntu-fi.org/index.php?topic=19483.msg144860#msg144860
Tuolta osui silmiin
Koodia: [Valitse]
for a in * ; do j=`echo $a | sed 's/\[//g' | sed 's/\]//g'`;mv "$a" "$j"; done;Tuon avullako voisi kansiot/tiedostot nimetä uudelleen? pienin muutoksin?

Itsetoimista kokeilua...
Tuon avulla onnistuu jollakin tapaa, eli pitää käyttää mv komentoa. eli pitää olla alkuperäinen tiedosto/kansio, joka nimetään toiseksi.
nyt etsitään vain oikea tapa tehdä tuo :)

jos siis olet tiedostonnimiä muuttamassa, niin mv on juuri oikea työkalu ja tuossa sedin avulla luodaan se uusi nimi muuttujaan j, jolloin muunnos onnistuu. eikös alkuperäinen tiedosto/hakemisto ole aina olemassa?

tosin pelkkään nimeämiseen valmis perl-scripti nimeltään rename saattaisi olla juuri omiaan.
Janne

UbunTux

  • Käyttäjä
  • Viestejä: 2046
  • KubunTux
    • Profiili
Vs: Tiedoston/kansion merkkien muuttaminen
« Vastaus #4 : 29.06.08 - klo:19.49 »
entäpä rename, joka toimii siis smantyylisillä lausekkeilla kuin sed
rename 's/&/and/g' * uudelleen nimeää kaikki hakemistosta
KDE neon
Uudempaa KDE:tä Ubuntulla

gdm

  • Sitä saa mitä tilaa...
  • Käyttäjä
  • Viestejä: 4363
    • Profiili
    • Keskustelualueiden säännöt
Vs: Tiedoston/kansion merkkien muuttaminen
« Vastaus #5 : 29.06.08 - klo:19.56 »
.
.
tosin väärinkäsitys oli minullakin, sillä jotenkin kuvittelin, että olit muokkaamassa tiedoston sisältöä.
.
.
jos siis olet tiedostonnimiä muuttamassa, niin mv on juuri oikea työkalu ja tuossa sedin avulla luodaan se uusi nimi muuttujaan j, jolloin muunnos onnistuu. eikös alkuperäinen tiedosto/hakemisto ole aina olemassa?
.
.
tosin pelkkään nimeämiseen valmis perl-scripti nimeltään rename saattaisi olla juuri omiaan.

Joo, väärinkäsitys on aina mahdollinen kun meikäläinen on selittämässä :)
Tarkoitus oli vaihtaa ~600 kansion ja ~10000 tiedoston nimistä, "&" merkki pois toiseen, vaikka "and".

Valmiit ohjelmat olisi helppo tapa, halu oppia tekemään se "yksin" komentoriviltä, on palkitsevampaa :)

Nyt mennään metsään ja lujaa... (parempi satasta metsään, kuin hiljaa sinne päin)

Koodia: [Valitse]
for a in `find . -iname '*&*'`; do j=`echo $a |sed 's/&/and/g'`; mv "$a" "$j"; done;Sedin jälkeinen osio taitaa olla kunnossa, mutta nuo alkupään tuotokset tuottaa vielä päänvaivaa...

Oli pakko kopioida yksi kansio jonka nimessä on &
ja yksi kansio, jonka jokaisessa tiedostossa on &
niin työpöydälle, vähän niinkuin harjoittelun vuoksi.

mv: tiedoston ”./Sebastian” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”Bach” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”-” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”Bring” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”'Em” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”Bach” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”Alive/Sebastian” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”Bach” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”&” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”Friends” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”-” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”Bring” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”'Em” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”Bach” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”Alive” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”-” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”12” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”-” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”Get” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”The” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”Fuck” tilaa ei voi lukea: No such file or directory
mv: tiedoston ”Out.mp3” tilaa ei voi lukea: No such file or directory


Tuollaista jälkeä syntyy tällä hetkellä :)
Kuitenkin tuo `find` komento yksinään tuottaa halutun listauksen.

Hetki menee että tuon ymmärtää miten tuo oikein toimii...
Lisää [Ratkaistu] aloitusviestiin jos ongelmasi selviää!
Saamasi tuki on ilmaista, joten älä vaadi tai uhkaile saadaksesi apua!

gdm

  • Sitä saa mitä tilaa...
  • Käyttäjä
  • Viestejä: 4363
    • Profiili
    • Keskustelualueiden säännöt
Vs: Tiedoston/kansion merkkien muuttaminen
« Vastaus #6 : 29.06.08 - klo:20.01 »
entäpä rename, joka toimii siis smantyylisillä lausekkeilla kuin sed
rename 's/&/and/g' * uudelleen nimeää kaikki hakemistosta

No pirskutarallaa
Koodia: [Valitse]
find . -name '*&*' |rename 's/&/and/g'Tuolla menee ihan oikein.

Lainaus käyttäjältä: Janne
tosin pelkkään nimeämiseen valmis perl-scripti nimeltään rename saattaisi olla juuri omiaan.
No niinpä tietysti...

Olisi ollut hyvä oppia kyllä tekemään se tuon pidemmän kaavankin mukaisesti.

Edit: heh, kaikenlaisten kokeilujen tuloksena oli joihinkin kansioihin ilmestynyt "Työpöytä" kansio :)
pitääpä olla varovaisempi seuraavilla kerroilla..
« Viimeksi muokattu: 29.06.08 - klo:20.09 kirjoittanut GoddamnDevil »
Lisää [Ratkaistu] aloitusviestiin jos ongelmasi selviää!
Saamasi tuki on ilmaista, joten älä vaadi tai uhkaile saadaksesi apua!

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Tiedoston/kansion merkkien muuttaminen
« Vastaus #7 : 29.06.08 - klo:22.36 »
Koodia: [Valitse]
for a in `find . -iname '*&*'`; do j=`echo $a |sed 's/&/and/g'`; mv "$a" "$j"; done;Sedin jälkeinen osio taitaa olla kunnossa, mutta nuo alkupään tuotokset tuottaa vielä päänvaivaa...

Tämä toimii paremmin. Bonuksena esittelen tässä vaihtoehdon echon käyttämiselle.

Koodia: [Valitse]
$ find . -iname '*&*' | while read a; do j=`sed 's/&/and/g' <<<$a`; mv "$a" "$j"; done

gdm

  • Sitä saa mitä tilaa...
  • Käyttäjä
  • Viestejä: 4363
    • Profiili
    • Keskustelualueiden säännöt
Vs: Tiedoston/kansion merkkien muuttaminen
« Vastaus #8 : 30.06.08 - klo:16.50 »
Tämä toimii paremmin. Bonuksena esittelen tässä vaihtoehdon echon käyttämiselle.

Koodia: [Valitse]
$ find . -iname '*&*' | while read a; do j=`sed 's/&/and/g' <<<$a`; mv "$a" "$j"; done

Toden teolla toimii :)
Kiitos tuosta, ja muillekin yhtä tasapuolisesti.

Mutta kysymys, mitä tuo <<< tekee?
Onko se niin että, < on sisäänpäin ja > ulospäin
> kirjoittaa sisällön >> lisää sisältöön...
Lisää [Ratkaistu] aloitusviestiin jos ongelmasi selviää!
Saamasi tuki on ilmaista, joten älä vaadi tai uhkaile saadaksesi apua!

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Tiedoston/kansion merkkien muuttaminen
« Vastaus #9 : 30.06.08 - klo:19.44 »
Tämä toimii paremmin. Bonuksena esittelen tässä vaihtoehdon echon käyttämiselle.

Koodia: [Valitse]
$ find . -iname '*&*' | while read a; do j=`sed 's/&/and/g' <<<$a`; mv "$a" "$j"; done

Mutta kysymys, mitä tuo <<< tekee?

Mistäköhän se selviäisi? Ai niin tietysti... ;)

Koodia: [Valitse]
$ man bash
[...]
   Here Strings
       A variant of here documents, the format is:

              <<<word

       The word is expanded and supplied to the command on its standard input.
[...]