Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: gdm - 29.06.08 - klo:17.14
-
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;
sed 's/&/and/g'
ja etsimiseen 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:
find . -name '*&*' | rename 's/&/and/g'
Etsii hakemiston sen alihakemistot läpi etsie kaikki "&" merkit ja muuttaa sen "and"
Ratkaisu 2:
find . -iname '*&*' | while read a; do j=`sed 's/&/and/g' <<<$a`; mv "$a" "$j"; done
Tekee ihan saman.
-
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.
-
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
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 :)
-
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
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.
-
entäpä rename, joka toimii siis smantyylisillä lausekkeilla kuin sed
rename 's/&/and/g' * uudelleen nimeää kaikki hakemistosta
-
.
.
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)
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...
-
entäpä rename, joka toimii siis smantyylisillä lausekkeilla kuin sed
rename 's/&/and/g' * uudelleen nimeää kaikki hakemistosta
No pirskutarallaa
find . -name '*&*' |rename 's/&/and/g'
Tuolla menee ihan oikein.
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..
-
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.
$ find . -iname '*&*' | while read a; do j=`sed 's/&/and/g' <<<$a`; mv "$a" "$j"; done
-
Tämä toimii paremmin. Bonuksena esittelen tässä vaihtoehdon echon käyttämiselle.
$ 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...
-
Tämä toimii paremmin. Bonuksena esittelen tässä vaihtoehdon echon käyttämiselle.
$ 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... ;)
$ 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.
[...]