Jos minulla on vaikka tiedosto: kuva.jpg
Haluasin tehdä BASH skriptin, joka tarkistaa, onko kuva muuttunut viime kerrasta, jos on niin luoda uusi thumbnail. Miten tämä helppoiten onnistuu?
Voisi tietenkin kopioida kuvan toiseen hakemistoon ja sitten verrata sen alkuperäiseen. Mutta tällöin tarvitaan kaksi kopiota kuvasta. Mikä tietenkin vie tilaa ja ei ole kovin tehokasta.
Onko jotain parempaa tapaa? En haluaisi käyttää ohjelmointikieliä jos ei ole aivan pakko ja homma onnistuu helposti bashillakin.
Haluasin tehdä BASH skriptin, joka tarkistaa, onko kuva muuttunut viime kerrasta, jos on niin luoda uusi thumbnail. Miten tämä helppoiten onnistuu?
Voisi tietenkin kopioida kuvan toiseen hakemistoon ja sitten verrata sen alkuperäiseen. Mutta tällöin tarvitaan kaksi kopiota kuvasta. Mikä tietenkin vie tilaa ja ei ole kovin tehokasta.
Onko jotain parempaa tapaa? En haluaisi käyttää ohjelmointikieliä jos ei ole aivan pakko ja homma onnistuu helposti bashillakin.
Vastaukset 19
Vanhimmat
Jos alkuperäisestä kuvasta ei ole kopiota missään, mihin se skriptisi voisi verrata, onko alkuperäinen kuva muuttunut?
Vaikka MD5/SHA1 hash checksummin avulla. Tai vaikka päivämäärän mukaan, jne...
Ehkä parempi tehdä loki teidostoista kuin kopioida tiedostot?
Jotain alkuperäisestä kuvasta tietenkin ja ilmeisesti tarvitaan että mitään vertailua voidaan tehdä.
Mikä lasketaan muutokseksi? touch-komennolla voi tehdä päivämäärämuutoksen kuvaan. Kuva ei ole silloin muuttunut, mutta sen päivämäärä on. Jos kuva on vain muistipuskurissa, ei ole mitään tiedostoa, mihin sitä verrata. Näin ollen vertailualgoritmin on löydyttävä käyttämästäsi ohjelmasta. Tiedostojen vertailu kun perustuu tiedostojen olemassaoloon hyvin pitkälti. Rsync:n avulla pystyy luomaan päivityskomennon, joka päivittää tiedoston esim. päiväyksen ollessa uudempi, kuin aiemmassa versiossa. Lisäksi se osaa laskea tiedostolle pyydettäessä koosteen(=tarkistussumman), jota vertaamalla se voi myös tehdä päivityksen. Päivityksen voi tehdä myös molempiin suuntiin, jolloin lähde ja kohde hakemistot synkronoituvat.
Valvontakameroissa on myös joissakin mahdollisuus tuollaiseen: Kamera alkaa lähettää kuvaa vasta, kun ruudussa on tapahtunut riittävän suuri muutos. Esim. loikkiva jänis ei välttämättä laukaise kameraa toimintaan, mutta isompi koira jo laukaisee. Tätä voi tietysti tehdä myös valvontakameran ohjelmistosta käsin, esim. zoneMinder:iin voi kytkeä tavallisen web-kameran ja ohjelma ottaa kuvia tarvittaessa.
Myöskin löytyy web-serverillä pyöriviä ohjelmia, jotka tekevät tätä: Piwigo:lla voit ladata kuvia serverille, joka skaalaa ne automaattisesti thumbnail näytettävään kokoon.
Ei siis ole mikään pakko tehdä itse skriptiä, millä toteuttaa joku(jo aiemmin toteutettu) asia TAAS uudestaan. Mutta jos välttämättä haluat yrittää, niin tässä:
$ touch zero
$ md5sum zero > zero.md5
$ md5sum -c zero.md5
zero: OK
$ echo $?
0
$ echo 0 > zero
$ md5sum -c zero.md5
zero: EI TÄSMÄÄ
md5sum: WARNING: 1 computed checksum did NOT match
$ echo $?
1
Kyllä se siitä lähtee, kun muistaa vielä if-syntaksin:
if [ $? -eq 0 ]; then echo 0; else echo 1; fi
Näin on mitä tuossa yläpuolella jo sanotaan. Jotta muutkosen tarkistus onnistuisi, täytyy olla olemassa tallennettua tietoa kuvista ja niihin liittyvistä pikku-kuvista. Minä laiskana miehenä en aloittaisi tekemään ohjelmaa tuon muutos-tietokannan ylläpitoon, vaan ajaisin tarkistus komennon kun siihen on tarvetta. Pikkukuvien teko vie niin vähän aikaa että ne heittämällä päivittää kaikki samalla kertaa.
Tein mallin jolla saa tilanteen ajantasalle kansio kohtaisesti näin:
find $HOME/Kuvat/*.png -type f -exec tee-pienoiskuvat {} \;
Ja pikkukuvien tekoon sopiva BASH SHELL Script löytyy kuvana täältä:
https://i.postimg.cc/kgWqFvkg/Valinta-021.png
Kirjoita tuo koodi tiedostoon $HOME/bin/tee-pienoiskuvat
Pikkukuvat tulevat olemaan leveydeltään 200px korkeuden ollessa lukittu leveyteen, muuta se haluamaksesi riviltä: 12
Pikkukuvan tunnisteena on nimeen lisätty osa "thumbnail-", jos se ei kelpaa tee muutkoset riveille:
6 ja 9. HUOM älä muuta rivillä 12 olevaa, se ei ole tunniste.
Riippuu nyt siitä haluatko, että päivittyneestä kuvasta tehdään thumbnaili vain sillon kun käyttäjä ajaa jonkin skriptin, vai haluatko että thumbnaili luodaan automaattisesti heti jos kuvaa muutetaan. Ensimmäiseen tapaukseen en tässä kommentoi. Jälkimmäisessä tapauksessa homman saa toimimaan erittäin helposti käyttämällä linuxin inotify -systeemiä. Eli siis Linuxin käyttöjärjestelmäydin ja tiedostojärjestelmät mahdollistavat sen, että jos esimerkiksi jotain tiedostoa muutetaan niin siitä syntyy inotify -tapahtuma, johon on mahdollista reagoida esimerkiksi suorittamalla jokin skripti aina kyseisen tapahtuman seurauksena. Esimerkiksi Debianissa on useitakin inotify -työkaluja, joilla on mahdollista laittaa haluttuja tiedotoja ja hakemistoja seurantaan ja tiedostojärjestelmältä tuleviin kyseisiin tiedostoihin tai hakemistoihin kohdistuviin ttapahtumiin voidaan sitten reagoida automaattisesti esimerkiksi suorittamalla jokin skripti Eli on täysin mahdollista automatisoida se, että jos jotain kuvaa päivitetään niin siitä luodaan uusi thumbnaili. automaattisesti. Esimerkiksi Debianissa voi hakea noita työkaluja esimerkiksi Synapticilla laittamalla hakusanaksi inotify.
T. miksuh
Pitkän jorinan sait aikaiseksi, kun ottaa huomioon mitä lukiessa jäi käteen;
Debianissa on Synaptic
ja että
Synaptic hyväksyy inotify hakusanan
Mainitsit myös että asian järjestäminen on helppoa, jäi kuitenkin epäselväksi, mitä tämä "helppous" on käytännössä. Ja jos kerta tähän on olemassa helppo ratkaisu, siitä voisi laittaa "helpon" esimerkin.
Ennenvanhaan kun tiedostoja oli vähän oli tärkeetä tietää oliko ne muuttuneet
Nkyisin on helpompaa / nopeempaa vaihtaa tilalle muutama (satamiljoonaa) tiedostoa vaikka ihan varmuuden vuoksi kuin alkaa tutkimaan onko joku yksittäinen tiedosto muuttunut.
Miten se, että haluaa tietää onko tiedosto muuttunut on muka vain jotain ennen muinoin juttua? Kyllä esimerkiksi itse voin kekskiä paljonkin syitä miksi voit haluta tietää onko jotain tiedostoa muutettu.
Ja kuten sanoin edellisessä viestissäni tiedostojen muuttamiseen reagoinnin voi automatisoida inotifyn avulla niin, että käyttäjän ei välttämättä tarvitse tehdä mitään kun käyttis voi tehdä halutun asian automaattisesti.
T. miksuh
Itselläni on tälläkin koneella tälläkin hetkellä käytössä inotifyyn perustuva automatisointi eräille tiedostoilleni ja hakemistoille.
T. miksuh
pcmanfm tekijä Hon Jen Yee väittää
että inotify on totaalisesti rikki?
Mistä kernel versiosta alkaen ne Sun mielestä on saaneet sen toimimaan?
Tässä on vain pari esimerkkiä niistä monista tavoista joita itse käytän Debianissa sen automatisointiin mitä tehdään, jos jotakin tiedostoa muutetaan.
1) Jos lataan webbiselaimella jonkin tiedoston netistä kotihakemistoni Downloads -hakemistoon niin käyttis huomaa sen ja lajittelee sen automaattisesti määrittelemieni sääntöjen perusteella tiettyyn alihakemistoon. Eli downloads -hakemistoni organisoituu automaattisesti.
2) Kaikki Downloads -hakemistoon tallennetutuudet tiedostot tarkistetaan Linuxin ClamAv -virustorjunnan avulla automaattisesti
3) Jos muutan kotihakemistossani olevassa dokumenttihakemistossa jotain tiedostoa käyttis huomaa, että haa tuota tiedostoa muutettiin ja tiedosto laitetaan versiohallintaan automaattisesti, eli mulla on aina versiohallinnassa historia dokumenttihakemistossa olevien tiedostojen muutoksista.
jne jne jne
T. miksuhe
En osaa sanoa mistä asti tai mitä tuo tyyppi on sanonut. Tiedän vain sen, että käytän tuota joka päivä. En toki epäile sitä, että tuota systeemiä ei voisi parantaa toki.
T. miksuh
Käyttis mitään huomaa. kernel heittää herjaa. ja toimii hyvin yhdellä levyOSIOLLA mutta jos kyseessä joku MUUUU levy OSIO niin johan takkuaa...
Just joo, kumma kun en tuollaist huomaa. Ja itsellänihän levyt on ainaollut pilkottuna hyvinkin moneen osioon. Tälläkin koneella on: /, /usr, /höme, /var/,/tmp, /storage (omat musiikkit, leffat jne), /virtual (virtuaalikoneet),/opt ja swap
T. miksuh
Itse käytän tietysti inotifyy koska nopee eikä kuluta turhaa tilaa / muistii
Mutta pitää ymmärtää sen (omituisuuden) puutteet eikä tehdä hätäisiä johtopäätöksiä..
Tiedosto voi olla muuttunut toisen levyn jollakin osiolla ja kernel ei mitään huomaa vaan menee "vanhalla" eikä graaffisen selaimen päivitys toimi (näyttää vanhaa tietoo?)
kyllä noi Debian pohjaset varmaan käyttää kehittyneempää tapaa?
Koska niiden käyttäjät ei tunnetusti mitään älyn jättiläisiä ole.
Siis typokorjauksena, tällä koneella on levyosiot:
/, /usr, /var, /tmp, /home, /storage, /virtual, /opt ja swap
T. miksuh
Mutta, edelleen minä kaipaan sitä mainitsemaasi helppoa ratkaisua, joka automaattisesti kuvien muokkaamisen tuloksena päivittää pikkukuvatkin. Jos nyt antaisit esimerkin, vaikka sillä Debianin helpolla inotifyllä, niin pääsisi kokeilemaan.
Lisätäänpä etten halua ruveta osioimaan mitään, vaikka kuinka helppoa olisi, riittää kun ne pikkukuvat päivittyy automaattisesti muokkauksen jälkeen.
"riittää kun ne pikkukuvat päivittyy automaattisesti muokkauksen jälkeen"
Täytyykö koneen muistin riittää myös muuhun toimintaan tuon lisäksi että Pikkukuvakkeet päivittyy 100 varmasti?