Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Asentaminen ja käyttöönotto => Aiheen aloitti: peg - 28.08.06 - klo:11.32
-
Pitäisi saada poistettua kansiosta suku ja sen kaikista alakansioista olevista tiedostoista rivit jotka sisältävät sanan
gallery.html . Tiedostoja on yli 500 kpl. hyvistä ohjeista kiitollinen, käsin en alaa aukomaan joka tiedostoa.??
-
Pitäisi saada poistettua kansiosta suku ja sen kaikista alakansioista olevista tiedostoista rivit jotka sisältävät sanan
gallery.html . Tiedostoja on yli 500 kpl. hyvistä ohjeista kiitollinen, käsin en alaa aukomaan joka tiedostoa.??
for i in `find suku/ -type f` ;
do echo $i;
grep -v $i gallery.html >/tmp/tmp.filu
cp /tmp.tmp.filu $i
done
Menisköhän noin, kannattaa kokeilla ensin jossain muussa kuin varsinaisessa kohdehakemistossa, esim tekemällä
suku/ kansiosta kopion muualle :)
Niin ja tuo siis suoritetaan terminaalissa ...
-
selitin heikosti, gallery.html ei ole tiedosto vaan teksti monessa tiedostossa (linkki galleriaan). ja nämä rivit joilla
teksti on pitäisi poistaa.
-
sed:llä onnistunee.
syntaksi on muotoa
sed 's/vanha/uusi/'
jos haluat poistaa sanan gallery.html niin silloin
sed 's/gallery.hmtl//'
ehkäpä jotenkin tähän malliin (kokeile ensin jossain muualla, ettei kaikki mene, tuo sed ei ole iha niitä vahvimpia puoliani ja päästä nyt heittelen):
cd suku
find ./ -type f -exec sed -i 's/gallery.html//' {} \;
find ./ -type f etsii kaikki tiedostot rekursiivisesti nykyisestä kansiosta
-exec <komento> {} \; - suorittaa <komennon> ja syötteenä jokainen tiedosto jonka find löysi
tuo sed:n -i -vipu on 'in place' eli korvaa tiedostosta
toivottavasti toimii ???
joku fiksumpi saa korjata, jos on korjattavaa
-
selitin heikosti, gallery.html ei ole tiedosto vaan teksti monessa tiedostossa (linkki galleriaan). ja nämä rivit joilla
teksti on pitäisi poistaa.
Ja juurikin tuon pitäisi esittämäni komennot tehdä.
grep -v $i gallery.html >/tmp/tmp.filu
Tämä komento tulostaa käsiteltävästä tiedostosta kaikki muut rivit paitsi ne jossa esinintyy gallery.html,
tulostus ohjataat tmp.filu:n joka sen jälkeen kopioidaan käsiteltävän tiedoston päälle.
-
grep -v $i gallery.html >/tmp/tmp.filu
Eikö grep tulkkaa tuota pistettä niin kuin säännöllisissä lausekkeissa kuuluu? Vaikka tuskimpa asialla on tässä tilanteessa sen suurempaa merkitystä. Itse laittaisin kuitenkin näin:
grep -v $i gallery\.html >/tmp/tmp.filu
tai näin, jos se ei hyväksy edellistä
grep -v $i 'gallery\.html' >/tmp/tmp.filu
-
Teidän greppaukset toimisivat huomattavasti paremmin jos antaisitte parametrit oikeassa järjestyksessä.
$ man grep
GREP(1) GREP(1)
NAME
grep, egrep, fgrep, rgrep - print lines matching a pattern
SYNOPSIS
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]
DESCRIPTION
[...]
Oikea muoto komennolle olisi siis
grep -v gallery\.html "$i" >/tmp/tmp.filu
Tämän lisäksi tuo väliaikaistiedosto olisi syytä kopioimisen (cp) sijasta siirtää (mv). Nyt järjestelmään jää yksi ylimääräinen tmp.filu-tiedosto.
Koko homma onnistuu kuitenkin siististi sed:n avulla ja alkuperäisen skriptin sijasta saman asian voi tehdä yhdellä rivillä.
$ find suku/ -type f -print0 | xargs -0 -L1 sed -i /gallery\.html/d
Suosittelen kuitenkin varmuuskopion ottamista ennen tuon ajamista. Silloin harmittaa huomattavasti vähemmän jos jälkikäteen paljastuu että jollakin gallery.html-tekstin sisältäneellä rivillä oli jotakin muuta tärkeää mitä ei olisi saanut tuhota :)
-
Kiitokset teille, olipa tosi kätevä. Mistä näitä voi opiskella lisää. linkkejä kiitos. Linux.fi komentokehoite vinkit luettu.
-
Kiitokset teille, olipa tosi kätevä. Mistä näitä voi opiskella lisää. linkkejä kiitos. Linux.fi komentokehoite vinkit luettu.
Tästä on hyvä aloittaa:
http://forum.ubuntu-fi.org/index.php?topic=303.0