Kirjoittaja Aihe: Pienet näppärät scriptit (bash, python, perl yms.)  (Luettu 113519 kertaa)

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11433
    • Profiili
    • Tomin kotisivut
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #180 : 11.04.12 - klo:17.28 »
Jotain laskuja olen joskus laskenut bc:llä. Auttaisiko se?
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

vellu@vmach

  • Käyttäjä
  • Viestejä: 348
  • Kiroitusvirheitä jo vuodesta feisty
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #181 : 12.04.12 - klo:01.32 »
Lainaus
Jotain laskuja olen joskus laskenut bc:llä. Auttaisiko se?
Sillähän se onnistui. Jouduin taistelemaan yön tunneille, kun muuttujat eivät ymmärtäneet desimaaleja.
No nyt se on valmis ja toimii. Vielä pitäisi keksiä joku käyttötarkoitus tuolle :). Ehkä siitä on apua ylikellottajalle.
Koodia: [Valitse]
#!/bin/bash

## Prosessorin lämpötilan seuranta työkalu ##
# Alku kysymykset ja asetukset
read -p "Kuinka kauan lämpötilaa mitataan? (minuuttia) >" MINSAT
KERRAT=$[MINSAT*20] ; SUMMA=0.0 ; MAX=1

# laskuri
for muuttuja in $(seq $KERRAT)
  do
  sleep 3
  TULOS=$(sensors |grep temp1 | cut -c 16-19)
  echo "Mittauskerta nro: $muuttuja. Lämpötila : $TULOS C"
  SUMMA=$(echo "$SUMMA+$TULOS" | bc)
  BC=$(echo "$TULOS>$MAX" | bc)
if [ "$BC" = 1 ]
then
  echo "* Uusi maximi ******* $TULOS C *******"
  MAX=$TULOS
fi
done

# Loppu summa summarum
KESKIARVO=$(echo "$SUMMA/$KERRAT" | bc)
echo "Keskiarvo  : $KESKIARVO   C"
echo "Maksimi    : $MAX C"

PS. Vanha Opteroni ei noussut kuin 57C piitä laskemalla, vaikka kelloja on nostettu  +25%
« Viimeksi muokattu: 12.04.12 - klo:02.37 kirjoittanut vellu@vmach »

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11433
    • Profiili
    • Tomin kotisivut
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #182 : 12.04.12 - klo:15.21 »
Ottaahan se desimaalejakin, kun niin käskee.
Koodia: [Valitse]
echo "scale=10;1/7" |bcja tuolla voi tehdä vaikka muunnoksia:
Koodia: [Valitse]
echo "ibase=16;obase=A;3D |bcvai tarkoititko, että bash ei tykännyt?
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

petteriIII

  • Käyttäjä
  • Viestejä: 657
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #183 : 12.04.12 - klo:18.32 »
Vanhojen Linux-BASH-gurujen töissä on vaikka mitä, mutta noiden töiden löytäminen on melkein mahdotonta. Kun kerää töitä noilta guruilta skriptiajurin tietokantoihin mitenkään niitä seulomatta niin vaikka noista töistä löytääkin vain pieniä palasia omiin projekteihinsa niin kasaaminen on nopeaa.

Tässä esimerkiksi rullahiiren lukeminen:
- tämä rullahiiren lukija toimii tekstitilassa. x&y on sen kirjainpaikan koordinaatit joita hiiriosoitin osoittaa kun hiiren rullaa näpsäytetään.
- kun rullaa näpäytetään tulostuu merkityksellisellä rivillä kolmantena merkki ! ja senjälkeen y ja sitten x ascii-muodossa.
- näytön vasen yläkulma on 0 0 ja ja oikea alakulma <tekstirivien luku näytölläsi> <tekstirivin pituus näytölläsi>.
- seuraavaksi lasketaan x&y desimaalisina. 
- kun haluat käyttää tätä ali-rutiinina skriptissäsi korvaa viimeinen echo sanalla break;   . X ja y siirtyvät globaalialueella
- Jos ylä- ja sivupalkin alueella näpsäyttää omii käyttöjärjestelmä näpsäyksen ja tekee omia juttujaan; senkun vaan sulkee avautuneet ikkunat ja jatkaa hommia.
- Eikä oikeakaan laitakaan välttämättä toimi. Vakioissakin olisi varmasti virittämisen varaa.

Koodia: [Valitse]
#!/bin/bash
while true; do 
 echo -en "\e[?1003h"; read -sn6 -t 0.05 key ; echo -en "\e[?1000l";[[ ${key:3:1} = "!" ]] && x=$(LC_CTYPE=C printf '%d' "'${key:4:1}") && y=$(LC_CTYPE=C printf '%d' "'${key:5:1}"); echo -en '\rrullaa on näpäytetty rivillä: '$((y - 33))'    kirjainpaikalla: '$((x - 33))'           '; done

K-Veikko

  • Käyttäjä
  • Viestejä: 309
    • Profiili
En tykkää gedit'in antamasta oletusnimestä "Nimetön asiakirja 1", joten käynnistän gedit'in skriptillä

Koodia: [Valitse]
#!/bin/sh

# AIKA=$(date +%Y-%m-%d_%T)
# AIKA=$(date +tekstia_%F_%T)
# man date

AIKA=$(date +%Y-%m-%d_%H-%M-%S.txt)
cd $HOME/TMP/
/usr/bin/gedit $AIKA

- Tietenkin $HOME/TMP/ -hakemisto (tai vastaava) on jo oltava olemassa.
- Skriptin saa kätevästi yläpalkkiin, kun siirtää sinne gedit'in kuvakkeen. -> ominaisuudet -> suoritettavaksi komennoksi laittaa tuon skriptin. (esim $HOME/.skripti-kaynnistys-gedit)

Tiedoston vaeltaessa eri palvelimien välillä (esim Ubuntu one), sen aikaleima saattaa matkalla hävitä. Nyt nimessä säilyy edes jonkinlainen tieto luontipäivästä.
« Viimeksi muokattu: 15.04.12 - klo:18.23 kirjoittanut K-Veikko »

petteriIII

  • Käyttäjä
  • Viestejä: 657
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #185 : 21.04.12 - klo:11.58 »
Teinpä käskyjonon asteiden muuttamiseksi radiaaneiksi. Se toimii perus asennuksella, siis ilman lisäpakettien apua:

asteet=30.72; radiaanit=$(echo "scale=10; $asteet * $(echo "scale=10; 4*a(1)" | bc -l) / 180 " | bc ); echo $asteet' astetta on: '$radiaanit' radiaania'

- luvut ovat muuten tekstijonoja.
- Piin arvoon ainakin sai 50 oikeaa numeroa, loppuja 10000:tta en viitsinyt tarkistaa. Tarkkuutta saa justeeraamalla scale:a.
- ilmanmuuta näppärämpiäkin löytyy, siitähän tämä Linux on hyvä - tai peruna jos ottaa sen toisella tavalla.
« Viimeksi muokattu: 21.04.12 - klo:17.00 kirjoittanut petteriIII »

petteriIII

  • Käyttäjä
  • Viestejä: 657
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #186 : 25.04.12 - klo:12.32 »
Skriptit ovat hitaita. Mutta itseasiassa  ne ovat 1..2 kertaluokkaa nopeampia kuin mitä väitetään; päädyin mielipiteeseen koska:

BASH:in alimman tason käskyt ovat todella liukkaita käsitellä ja avuksi onkin tehty grep, awk, sed ... ; ne ovat miellyttävämpiä käyttää mutta vastaavasti hitaampia. Koska ne on tehty käsittelemään tiedostoja niin eihän niiden hitaus missään näy; kyllä levy on se hitain jokatapauksessa.

Aloinpa tänäaamuna laittaa skriptini levylle kirjoituksia kuntoon: levyviittauksissa sallitaan että kun kansioon viitataan niin merkki / saa olla // tai /// tai ... Mutta lopulta mylly kaatuu tuommoisiin nimiin ja jokatapauksessa inhottavan näköistähän se on. Päätin poistaa turhat.  Teinpä temppuja monenlaisia mutta lopulta päädyin seuraaviin:
apu=${KansionNimi%%[[:alnum:]]*}; KansionNimi=${KansionNimi:${#apu}} # siistitään kansionnimi alkamaan aakkosnumerolla
apu=${KansionNimi%[[:alnum:]]*}; KansionNimi=${KansionNimi:0:$((${#apu}+1))} # siistitään kansionnimi päättymään aakkosnumeroon

Rupesin sitten pähkäilemään kuinka nopeita ne ovat. Enpähän sano mitään sillä tulos on naurattavan nopea.

 

ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3401
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #187 : 25.04.12 - klo:13.40 »
Lainaus
Skriptit ovat hitaita. Mutta itseasiassa  ne ovat 1..2 kertaluokkaa nopeampia kuin mitä väitetään;
Ei ole mikään nopeusraja tullut vastaan niissä tarkoituksissa mihin niitä itse olen tehnyt.  Omaan kirjoitusnopeuteeni verrattuna suorastaan rajattoman nopeita.   Varsinainen ilon aihe on miten paljon pienellä pätkällä skriptiä voi saada aikaan, tavanomaisilla ohjelmoitikielillä saisi usein näpytellä näppäimistöä pitkästi.  
Autamme ilolla ja ilmaiseksi omalla ajallamme.  Ethän vaadi, uhoa tai isottele näin saamasi palvelun johdosta.

petteriIII

  • Käyttäjä
  • Viestejä: 657
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #188 : 25.04.12 - klo:14.34 »
Varsinainen ilon aihe on miten paljon pienellä pätkällä skriptiä voi saada aikaan, tavanomaisilla ohjelmoitikielillä saisi usein näpytellä näppäimistöä pitkästi.  

Tottapa haastat, olen ihan samaa mieltä. Mutta täytyy myöntää että olen hölmön haavoittuva c++:n harrastajien nopeudella kehumiselle ja BASH:in halveksunnalle.

Skriptien siemeniä: Linux:issa voi tulostaa siten, että ensin ohjelma ei vaivaudu muotoilemaan tulostusta ollenkaan ja ohjelman loppuun liitetään Linuxin muotoilu-ohjelman kutsu. Tähän tapaan:
esimerkki 1: for m in {0..32}; do for n in {0..10}; do echo -n  $[ ( $RANDOM % 10000 )  + 1 ]' '; done; echo; done | column -t
esimerkki 2: cat /etc/passwd | column -ts:

- noita muotoiluohjelmia on monia muitakin ja niillä paljon kytkimiä joten teoriassa tulostuksen saisi helpohkosti kunnolliseksi. Muita muotoiluohjelmia tusina, esimerkiksi: paste, expand, fmt, newform, csplit, pr, stty, tput ....tai kaikkeehan voi käyttää kaikkeen.
« Viimeksi muokattu: 29.04.12 - klo:05.48 kirjoittanut petteriIII »

petteriIII

  • Käyttäjä
  • Viestejä: 657
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #189 : 29.04.12 - klo:18.45 »
Aloinpa miettiä miksi BASHista puuttuu desimaaliluvut. Ilmeisesti se on kehittäjien tapa kertoa että se johtaisi eksponenttimuotoiseen esitykseen ja on parempi olla  sotkeutumatta sellaiseen joka on jossain mielessä kelvotonta. On niitä desimaaliluvuilla laskevia sovelluksia silti monia, tässä muutama. Esimerkeistä selviää vasta periaate ja ne vaativat vielä etupäätä.
Teoriassa sinit ja kosinit tunnetaan, pii, logaritmit .... joskaan niitä ei noihin noinvain tungeta.
- luvun numeromäärän kasvaessa siirrytään muissa sovelluksissa lähes aina eksponenttimuotoon mutta tässä ei sillä eksponenttimuodossa tarkkuus romahtaa.
- ja tosiaan BASHiin pätee: kenties nämä jopa laskee väärin joissakin tapauksissa mutta enpähän edes välitä sillä parempia skriptejä on noin miljoona.
- BASH on aina hidas tai sanottaisiinko ei-nopea. Ja jos tekee hommat väärin niin almannakkaa tarvitaan.
Koodia: [Valitse]
esimerkki 1:
#!/bin/bash
function laske () {
tulos=$(eval echo $(echo '"'$(echo ${@} | tr -d " " )'"') | bc -l)
}
laske 0.123456789012345678901234567890123456789 +0.00000000000000000000000000000000000001 +123456789012345678901234567890123456789 *1
echo $tulos
read -p 'paina enter jatkaakseesi'
# keno on  tutkinnassa; taitaa se tuloksessa ollakin
# laskettavia voi teoriassa laittaa kuinka monta vaan eikä sitä täydy kertoa missään.
# kaikki normaalit laskutavat +, -, *, /, %(=jakojäännös) tunnetaan ilmanmuuta ja lisää saa pikkuisen virittämällä.
# desimaaleissa löytyy. Niiden määräämistä en hallitse, kai se scale pitäisi ahtaa johonkin.

esimerkki 2:
#!/bin/bash
# awk siirtyy eksponenttiesitykseen kun numerot ei muuten riitä. Awk kykenee myösa sineihin sun logaritmeihin.
luvut[0]='1 2 3.33333'
luvut[1]='4 5 6.66666'
luvut[3]='7 8 9.99999'
echo -e 'matriisin\n '"${luvut[@]/%/\n}""\n"
echo -e ' '"${luvut[@]/%/\n}" |  awk '{summa+=$3} END {print "sarakkeen 3 summa on: ",summa}'
echo ${luvut[1]} | awk '{s=0; for (i=1; i<=NF; i++) s=s+$i; print "rivin 1 summa on: "s}'  
echo -e ' '"${luvut[@]/%/\n}" | awk '{for (i=1; i<=NF; i++) s=s+$i}; END{print "koko matriisin summa: "s}'
read -p 'paina enter jatkaakseesi

- ongelmat ratkesi bc:llä  - ainakin 138 numeron tarkkuuteen.
- kun tekee etupään geditistä saa laskimen, joka kelpaa vaikka veroilmoituksen vähennysten laskemiseen - pennilleen valtion budjetissa. Tietenkään kukaan ei kuvittelisikaan käyttävänsä tällaista, mutta mikäli vaivautuu tekemään muun laskutusjärjestelmän - noin pari vuotta ja kaikki kaupalliset jäisi toiseksi.
- kaupallinen ei koskaan ole luotettava. Itsetehdyssä jokainen lisäpaketti johon joutuu turvautumaan pienentää sekin luotettavuutta.

Toinen asia: olen käyttänyt skriptieni funktionimissä ääkkösiä muutamia kuukausia ja hyvin tuntuu toimivat. Tiedostonimissä on ollut ääkköset jo vuosia. Samoin välilyönti on ongelmaton kunhan laittaa tiedostonimen sulkeisiin -  kenoa ei kannata tiedostonimissä käyttää.

Uusi: Aina sillointällöin läppärini bluetooth lakkaa toimimasta. Takaisin toimintaan sen saa käskyllä: sudo service bluetooth restart . Mutta minun päässäni  ei muistia olekaan joten neljän sanan muistaminen on mahdotonta. Mutta kun käsky on kerran annettu pysyy se Ubuntun muistissa ikuisesti ja sen saa suoritettua uudestaan käskyllä: !?bluetooth
- tosin historia on vain 500 riviä alkuunsa. Sen saa rajoittamattomaksi kun laittaa tiedostoon .bashrc käskyn: export HISTSIZE=""
- muistikoot ovat nykyään niin suuria ettei se ei aiheuta vaikeuksia koskaan.
- !?käskyn_osa toimii kaikissa tilanteissa.



 
« Viimeksi muokattu: 08.05.12 - klo:06.36 kirjoittanut petteriIII »

petteriIII

  • Käyttäjä
  • Viestejä: 657
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #190 : 09.05.12 - klo:13.18 »
Nopeuksien noustessa suureksi time-käsky näyttää turhan karkeasti. Verkosta löysin tällaisen jolla on nanosekunnin resoluutio. Olisi  oikein  mielenkiintoista tietää mikä on sen todellinen tarkkuus?
En löytänyt netistä.

Koodia: [Valitse]
#!/bin/bash
# mitattava rutiini laitetaan lauseiden: Alkuhetki=$(date +%N) ja Loppuhetki=$(date +%N) väliin.
Alkuhetki=$(date +%N)
echo $(awk -F':' '$6 ~ /home/ && $3 >= 500 { print $1 }' /etc/passwd)
Loppuhetki=$(date +%N)
echo 'Aika nanosekunteina: '$(echo $Loppuhetki-$Alkuhetki | bc )


retu

  • Käyttäjä
  • Viestejä: 949
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #191 : 10.05.12 - klo:11.42 »
En tiedä, mutta veikkaan että nanosekunti. Perustunee prosessorin kellolaskuriin, joten nykyisillä prossuilla on ihan hyvin mahdollista.

Eri asia on sitten että tuon date-komennon ajamiseen kuluu pikemminkin millisekunteja.

petteriIII

  • Käyttäjä
  • Viestejä: 657
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #192 : 10.05.12 - klo:14.21 »
Viiveet ovat kummassakin aikamäärityksessä samat sulkien toisensa pois. Värinäähän voi silti olla, mutta koetapas seuraavaa:
Laita ajoitettavaksi käskyksi: sleep 1  . Tuloksena onkin noin 1.005 + värinä. Eihän tuollaista aikaansaa mikään.

ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3401
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #193 : 10.05.12 - klo:20.47 »
Lainaus
Verkosta löysin tällaisen jolla on nanosekunnin resoluutio. Olisi  oikein  mielenkiintoista tietää mikä on sen todellinen tarkkuus?

Kokeilitko:

Koodia: [Valitse]
date +%N;date +%N
Arviosi ?
Autamme ilolla ja ilmaiseksi omalla ajallamme.  Ethän vaadi, uhoa tai isottele näin saamasi palvelun johdosta.

petteriIII

  • Käyttäjä
  • Viestejä: 657
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #194 : 11.05.12 - klo:06.41 »
Mielenkiintoista, tuohan kestää kauan - ihan liian kauan.

Laskeskelin paljonko ne vaihtelee. Sekin tuntuu olevan luokkaa 0.2ms - joskus voi tulla paljonkin isompi ero.

Ihan mutua: tuntuu että viimeaikoina asiat ovat sentään melkolailla parantuneet.

Tein skriptin asian tutkimiseksi, se kertoo eron millisekunneissa:
Koodia: [Valitse]
for n in {0..50}; do ajat=$(date +%N;echo -n '  ';date +%N); aika1=${ajat%% *}; aika2=${ajat##* }; echo "$aika2 - $aika1" | bc ; done
mutta sitten eksyin pikkuisen sivuraiteelle: linuxin voi ladata RAMmiin. Se tuntuu vaikuttavan.

Rammiin lataaminen on yksinkertaisinta tehdä live-CD:ltä - kuulemma CD-asemakin  vapautuu muuhun käyttöön boottaamisen jälkeen , mutta en ole varma kun itse boottaan USB-tikulta. Lataaminen käy näin:
Aloita boottaus live-CD:ltä ja valitse kieli: kieli on pakko valita vaikka valitsisi englannin. Seuraavaksi painetaan nappia f6 ja sitten nappia ESC  ja kirjoitetaan toram ja painetaan return.

Toinen juttu: kyllä BASH on kiva kun sen toiminta on aivan ennustettavissa: esimerkiksi kun haluaa tietää kuinka monta riviä on jonkun kansion kaikissa tiedostoissa (paljonko lokeihin on kirjoitettu, paljonko historioihin jne.) niin käsky on:
wc -l <kansio polkuineen>/*  | awk {'print $1'} | tail -1

Ennustettavuudesta puheenollen:
Koodia: [Valitse]
#!/bin/bash
luvut[0]='1 2 3'
luvut[1]='4 5 6'
luvut[3]='7 8 9'
echo 'matriisi on: '; echo -en ' '"${luvut[@]/%/\n}"
echo -e ' '"${luvut[@]/%/\n}" |  awk '{summa+=$1} END {print "sarakkeen 1 summa on",summa}'

Tai esimerkiksi gedit <kansio polkuineen>/* joka on erittäin mukava käyttöohjeiden kanssa sillä niitähän ei koskaan saa laittaa yhteen pötköön niinkuin melkein aina on tehty - sillä tuloksena on sellainen tiiliskivi jota kukaan ei lue. Ja kun ne jakaa tiedostoihin niin niiden lukumäärät ja nimet vaihtelevat kokoajan ja ellei editori ota sitä automaattisesti huomioon niin koodia joutuu puukottamaan usein. Kauan sitten kuvittelin että hyper-linkit ovat ratkaisu tähän, mutta eivät ne ole.

Tulipa eteen ongelma: matriisin kopioiminen toiseen matriisiin: BASHissa matriisin jäseniä voi määritellä siellä-täällä vaikka epäjärjestyksessä. Kopiointiin tulee lisäongelma indexien siirtämisestä. Koko homma onnistuu kootulla-käskyllä:
Koodia: [Valitse]
for n in ${!matriisi[*]}; do matriisinkopio[$n]=${matriisi[$n]}; done
- käsky toimii myös assosiatiivisilla matriiseilla. Mutta assosiatiivisten matriisien indexit ja sisällöt on jotenkin solmussa.

Pitipä lukea päiväukset sun muut. Sehän onnistuu yhdellä käskyllä: (muuten IFS on .välilyönti)
IFS=". " read -r viikonpaiva vuosi kuukausi paiva tunti minuutti sekunti alue <<< $(date); unset IFS



« Viimeksi muokattu: 07.06.12 - klo:09.22 kirjoittanut petteriIII »

vellu@vmach

  • Käyttäjä
  • Viestejä: 348
  • Kiroitusvirheitä jo vuodesta feisty
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #195 : 13.06.12 - klo:13.22 »
Tämä ei ole skripti, vaan alias .bashrc:hen lisättäväksi. Tätä ilman en tulisi toimeen:
Koodia: [Valitse]
alias herätys='echo "Moneltako se herra aikoo heräillä?" ;read WAKEUP ; echo mpg321 "/home/vellu/temppi/herätysbiisit/*.mp3" | at $WAKEUP'
ps. Polku pitää muuttaa ja asentaa mpg321. Aika muodossa 07:15 tai 0715.

Jakke77

  • Käyttäjä
  • Viestejä: 3932
  • Oulu (Oinaansuo)
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #196 : 11.09.12 - klo:15.11 »
nostellaanpa
U_G_H

Aspire E5-575G V1.27 CPU: Intel i3-6100U (4) @ 2.300GHz GPU: Intel® HD Graphics 520 GPU: NVIDIA GeForce 940MX Samsung SSD 970 EVO Plus 500GB

JoniR

  • Käyttäjä
  • Viestejä: 112
    • Profiili
    • Peugeot 206
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #197 : 31.07.13 - klo:11.38 »
Hei,
Osaisiko joku auttaa tälläisessä ongelmassa.
Haluaisin scirptin, joka käy läpi kohde kansiossa olevat alikansiot ja muodostaa kaikkiin kansioihin symbolisen linkin joka ohjaa tiettyyn paikkaan.
Esim näin:
/home/joni/temp/work/kuvat/index/tiedosto.txt <<-- Tiedosto johon haluan linkin viittaavan
Kansiorakenne, jonne haluan linkkien muodostuvan:
-a
--a.a
--a.b
-b
--b.b

Yritin tämän tyylisellä scriptillä, mutta ei oikein tuottanut tulosta(tässä ei nyt ole tuota alihakemistojen looppaustakaan)
Koodia: [Valitse]
#!/bin/bash

SOURCE="/home/joni/temp/work/kuvat/index"
DEST="/home/joni/temp/work/kuvat/a"

cd -- "$SOURCEDIR"

find -type f -exec ln --symbolic -- "$SOURCEDIR"/{} "$DESTDIR"/{} \;

exit

Tässä on sellainen ongelma, että linkit yrittää muodostua ihan väärään paikkaan:
Koodia: [Valitse]
ln: creating symbolic link `/./CreateSym': Permission denied
ln: creating symbolic link `/./index/tiedosto.txt': No such file or directory

Olen ilmeisesti lähtenyt ratkaisemaan ongelmaa vähän väärästä suunnasta, mutta nyt ajatustasollakin olen täysin jumissa :)

-Joni

ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3401
    • Profiili
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #198 : 01.08.13 - klo:09.21 »
Lainaus
Olen ilmeisesti lähtenyt ratkaisemaan ongelmaa vähän väärästä suunnasta

Ei suinkaan.

"find" hakee kaikki haarat ellet sitä erikseen estä.  Tuo linkin teko menee näin (päin):

Koodia: [Valitse]
ln -s   <tähän_se_kohdekansio_tai_tiedosto>    <tähän_minne_se_linkki_tehdään_ja__sen_nimi>
Esimerkki:
Ajatellaan että meillä on Matin kotikansion alla /bash kansio.  Haluamme luoda paikkaan /home/matti linkin jonka nimi on "pässi-jutut".  Kirjoitellaan  näin:

Koodia: [Valitse]
ln -s  /home/matti/bash    /home/matti/pässi-jutut
Kerron lisää kun ehdin ellet sitä ennen pääse eteenpäin näillä.

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

JoniR

  • Käyttäjä
  • Viestejä: 112
    • Profiili
    • Peugeot 206
Vs: Pienet näppärät scriptit (bash, python, perl yms.)
« Vastaus #199 : 01.08.13 - klo:11.47 »
Jotenkin hämäännyin tuosta Find tulostuksesta eilen. Sehän ei tosiaan tulostanut absoluuttistapolkua joten tuo linkki yritettiin lisätä aina kansioon /./.
Noh tänään uudelleen ja nyt homma toimii. Kiitos ajaaskel avusta.
Koodia: [Valitse]
#!/bin/bash
for D in $(find /home/joni/temp/work/kuvat/kansiot/ -mindepth 1 -maxdepth 5 -type d) ; do
    ln -s /home/joni/temp/work/kuvat/index/tiedosto.txt $D/tiedosto.txt 2>/dev/null
done
-Joni