Kirjoittaja Aihe: Skriptiapua? tiedoston populointi..  (Luettu 2175 kertaa)

odysseus

  • Vieras
Skriptiapua? tiedoston populointi..
« : 18.05.11 - klo:16.19 »
Jaahas, nyt tuli pieni ongelma eteen. Osaako joku paremmin skriptejä?

Ongelma on se, että pitäisi luoda (kopioida) sama tiedosto useaan hakemistoon automaattisesti eri nimiseksi.

Eli minulla on hakemistot valmiina ja niihin tulee tiedostot, sanotaan vaikka näin:

<joku_kiinteä_polku><vaihtuva_hakemiston_nimi><ISO2_kielikoodi><0.txt|1.txt|2.txt|...|n.txt>

Ja sitten minulla on yksi lähdetiedosto, (vaikka "source.txt") joka pitäisi saada kaikkiin haluttuihin hakemistoihin numeroituna halutun monta kertaa... Tiedoston sisältö on siis sama kaikissa generoiduissa.

Siis alkuperäinen pitäisi mennä vaikka näihin:

/opt/softa/dataX/fi/0.txt
/opt/softa/dataX/fi/1.txt
/opt/softa/dataX/fi/2.txt
/opt/softa/dataX/fi/3.txt
/opt/softa/dataX/se/0.txt
/opt/softa/dataX/se/1.txt
/opt/softa/dataX/se/2.txt
/opt/softa/dataX/se/3.txt

/opt/softa/huuhaa/fi/0.txt
/opt/softa/huuhaa/fi/1.txt
/opt/softa/huuhaa/fi/2.txt
/opt/softa/huuhaa/fi/3.txt
/opt/softa/huuhaa/se/0.txt
/opt/softa/huuhaa/se/1.txt
/opt/softa/huuhaa/se/2.txt
/opt/softa/huuhaa/se/3.txt

/opt/softa/jeejee/fi/0.txt
/opt/softa/jeejee/fi/1.txt
/opt/softa/jeejee/fi/2.txt
/opt/softa/jeejee/fi/3.txt
/opt/softa/jeejee/se/0.txt
/opt/softa/jeejee/se/1.txt
/opt/softa/jeejee/se/2.txt
/opt/softa/jeejee/se/3.txt

Onko apuja scriptiin, vai pitääkö västä jollain muulla "!aidolla ohjelmalla"?

jekku

  • Käyttäjä
  • Viestejä: 2624
    • Profiili
Vs: Skriptiapua? tiedoston populointi..
« Vastaus #1 : 18.05.11 - klo:17.23 »
Jaahas, nyt tuli pieni ongelma eteen. Osaako joku paremmin skriptejä?

Ongelma on se, että pitäisi luoda (kopioida) sama tiedosto useaan hakemistoon automaattisesti eri nimiseksi.

Eli minulla on hakemistot valmiina ja niihin tulee tiedostot, sanotaan vaikka näin:

<joku_kiinteä_polku><vaihtuva_hakemiston_nimi><ISO2_kielikoodi><0.txt|1.txt|2.txt|...|n.txt>

Ja sitten minulla on yksi lähdetiedosto, (vaikka "source.txt") joka pitäisi saada kaikkiin haluttuihin hakemistoihin numeroituna halutun monta kertaa... Tiedoston sisältö on siis sama kaikissa generoiduissa.

Siis alkuperäinen pitäisi mennä vaikka näihin:

/opt/softa/dataX/fi/0.txt
/opt/softa/dataX/fi/1.txt
/opt/softa/dataX/fi/2.txt
/opt/softa/dataX/fi/3.txt
/opt/softa/dataX/se/0.txt
/opt/softa/dataX/se/1.txt
/opt/softa/dataX/se/2.txt
/opt/softa/dataX/se/3.txt

/opt/softa/huuhaa/fi/0.txt
/opt/softa/huuhaa/fi/1.txt
/opt/softa/huuhaa/fi/2.txt
/opt/softa/huuhaa/fi/3.txt
/opt/softa/huuhaa/se/0.txt
/opt/softa/huuhaa/se/1.txt
/opt/softa/huuhaa/se/2.txt
/opt/softa/huuhaa/se/3.txt

/opt/softa/jeejee/fi/0.txt
/opt/softa/jeejee/fi/1.txt
/opt/softa/jeejee/fi/2.txt
/opt/softa/jeejee/fi/3.txt
/opt/softa/jeejee/se/0.txt
/opt/softa/jeejee/se/1.txt
/opt/softa/jeejee/se/2.txt
/opt/softa/jeejee/se/3.txt

Onko apuja scriptiin, vai pitääkö västä jollain muulla "!aidolla ohjelmalla"?


minä ainakin kokeilisin tyyliin
for i in 0 1 2 3
do
cp source.txt /opt/softa/dataX/fi/${i}.txt
cp source.txt /opt/softa/dataX/se/${i}.txt
...
cp source.txt /opt/softa/jeejee/se/${i}.txt
done

Tietysti tuon silmukan rajat voi lukea myös kutsusta...
(Ja on mielkikuva että tuon alueenkin voisi kerta ihan tyyliin 0 .. ${N} - mutta ei muistu mieleen ;)

ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3401
    • Profiili
Vs: Skriptiapua? tiedoston populointi..
« Vastaus #2 : 18.05.11 - klo:21.40 »
Tässä olisi pikku scriptinpätkät.  En tehnyt sitä yhteen könttiin vaan kaksi erikseen, on hieman yleiskäyttöisempi tässä muodossa.  Ensimmäinen komentotiedosto monistaa halutun määrän tekstitiedostoja.  Sille annetaan rivillä tiedoston polku/nimi sekä numero (eli lukumäärä).  Esimerkki

Koodia: [Valitse]
./monista koeteksti.txt 25  

tekee 25 kopiota tiedostosta "koeteksti.txt" ja nimeää ne kopiot 0.txt, 1.txt, 2.txt,.....

Tässä tuo koodin pätkä:

Koodia: [Valitse]
#!/bin/bash
# Monistaa halutun määrän tekstitiedostoja yhdestä lähdetiedostosta
# Käyttö:
#          monista tiedosto.txt lukumäärä
#
# Esimerkki "monista tiedosto.txt 3" tekee 3 kopiota ja nimeää ne 0.txt, 1.txt, 2.txt
#
if  [ $# -eq 2 ]; then
i=0
while [  $i -lt $2 ]; do
cp $1 $i.txt
let i=i+1
done
else
echo
echo "Käyttöesimerkki:   monista tiedosto.txt 3"
echo
echo "tekee 3 kopiota tiedostosta ""tiedosto.txt"" numeroiden ne 0.txt, 1.txt ja 2.txt"
echo
fi

Tuo pitää kopioida tiedostoon ja antaa sille nimeksi "monista" sekä antaa ajo-oikeudet.

Toinen komentorimpsu mahtui helposti yhdelle riville.   Se kopioi *.txt halutun hakemistopuun kaikkiin "lehtiin".    Tältä se näyttää:

Koodia: [Valitse]
find /kohdepolku  -type d -links 2 | xargs -n 1 cp *.txt
Tuossa /kohdepolku korvataan hakemistopolulla josta alaspäin scripti etsii vain polkujen latvahakemistot ja kopioi niihin.  Tunnistus perustuu siihen että hakemiston alla ei ole enää uutta hakemistoa.   Ylläolevassa tapauksessa se olisi "/opt/softa".  
Kopioi vain oletushakemistosta eli täytyy mennä "cd": n avulla ensin hakemistoon jossa nuo tekstit ovat.

 
« Viimeksi muokattu: 18.05.11 - klo:21.53 kirjoittanut ajaaskel »
Autamme ilolla ja ilmaiseksi omalla ajallamme.  Ethän vaadi, uhoa tai isottele näin saamasi palvelun johdosta.