Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: Welblaud 08 Března 2013, 15:07:47

Název: Automatická akce složky
Přispěvatel: Welblaud 08 Března 2013, 15:07:47
Rozhodl jsem se zkusit napodobit automatickou akci složky z macovského automatoru. Nedaří se mi ale překonat typické neznalosti...

Kód: [Vybrat]

#!/bin/bash
dir="$HOME/Plocha/bmp2jpg/"
inotifywait -qm -e close_write --format=%w%f "dir" | while read file
do
           [[ $file =~ \.bmp$ ]] && convert $file $file.jpg
done

Je mi jasné, že tvou dvojitou závorkou bych měl definovat proměnnou pomocí regulárního výrazu \.bmp$, nejsem si jistý uvozovkami u convert, každopádně když do složky cokoliv vložím, hlásí mi to [[: not found  ???

Věděl by někdo?
Název: Re:Automatická akce složky
Přispěvatel: pacholik 08 Března 2013, 16:57:49
> nejsem si jistý uvozovkami u convert
Jestli budou v názvech mezery tak budou potřeba. A jelikož jsou tam proměnné tak jedině dvojité.
Kód: [Vybrat]
convert "$file" "$file.jpg"
> [[: not found
Zřejmě ten skript spouštíš sh skript.sh. Buď to spouštěj bash skript.sh nebo tomu dej spustitelný příznak a spouštěj to ./skript.sh. [[ je čistě bashovská záležitost.

P.S. aby se ti ten soubor nejmenoval soubor.bmp.jpg, ale soubor.jpg tak
Kód: [Vybrat]
convert "$file" "${file%.bmp}.jpg"
Název: Re:Automatická akce složky
Přispěvatel: Welblaud 08 Března 2013, 18:23:39
Tak teď už se jen dostat přes
Kód: [Vybrat]
convert: unable to open image `{/home/honzuska/Plocha/jpg2bmp/WildWheat_by_Brian_Burt.jpg%bmp}.jpg':  @ error/blob.c/OpenBlob/2587.
  :)
Název: Re:Automatická akce složky
Přispěvatel: GdH 08 Března 2013, 18:33:47
Tak teď už se jen dostat přes
Kód: [Vybrat]
convert: unable to open image `{/home/honzuska/Plocha/jpg2bmp/WildWheat_by_Brian_Burt.jpg%bmp}.jpg':  @ error/blob.c/OpenBlob/2587.
  :)

Někde jsi něco zeslonil ;) Evidentně ta substiuce neproběhla správně, takže jsi radu pacholika implementoval špatně. Ten $ měl být před závorkou.
Název: Re:Automatická akce složky
Přispěvatel: Cuore 08 Března 2013, 18:55:17
k čemu to je dobré??  ::) můžeš se trochu rozepsat  ;) díky
Název: Re:Automatická akce složky
Přispěvatel: Welblaud 08 Března 2013, 19:29:39
Díky, už to funguje.  :) Věděl by nějaký pan rada, jak přidat do testu víc podmínek? Např. nejen bmp, ale i tiff apod.? Se to hezky rýsuje.

To Cuore: No to si člověk udělá takovou složku a pak tam jen hází fotky z foťáku a ony se zmenší, aby se daly posílat mailem, když to děláš často, je to fajn (nebo se to dá rovnou ze složky odesílat apod.)
Název: Re:Automatická akce složky
Přispěvatel: Cuore 08 Března 2013, 20:03:47
takže zmenšovadlo  ;D .... jo a velikost výstupní fotky děláš jak? Až to budeš mít hotovo, můžeš to dát do posledního příspěvku jako celek s popisem funkce? Věřím, že se to bude hodit více lidem  ;)
Název: Re:Automatická akce složky
Přispěvatel: Welblaud 08 Března 2013, 20:17:37
Milerád! No tak tohle je jen model, co se týče zmenšování, to se přidá pak, to už zvládnu, hrůza jsou proměnné a testování  :)

Zrovna s tímhle (inotify) se dá asi vymyslet pekelně hodně věcí.

Dobrý, takže když  dám do testovacích závorek vykřičník, pak všechno, co NENÍ jpg, převede se do něj. Nu, ještě bych rád věděl specifikaci jen více parametrů, např. bmp + tiff, jak jsem psal. Předpokládám, že bude nutné taky změnit přípony v těch {} závorkách dále.
Název: Re:Automatická akce složky
Přispěvatel: pacholik 08 Března 2013, 22:51:52
Kód: [Vybrat]
[[ $file =~ \.(bmp|png|tiff)$ ]]

"${file%.*}.jpg"
Název: Re:Automatická akce složky
Přispěvatel: Welblaud 09 Března 2013, 07:40:13
Pěkně, díky moc, budu zkoušet.
Název: Re:Automatická akce složky
Přispěvatel: GdH 09 Března 2013, 10:45:03
k čemu to je dobré??  ::) můžeš se trochu rozepsat  ;) díky

Inotify a vlastní akce založené na událostech ve filesystému (http://gdhnotes.blogspot.cz/2012/06/inotify-vlastni-akce-zalozene-na.html)

Věděl by nějaký pan rada, jak přidat do testu víc podmínek? Např. nejen bmp, ale i tiff apod.?

Ta podmínka se dá napsat univerzálněji, aby nezáleželo na velikosti písmen třeba takhle:
Kód: [Vybrat]
if egrep -iq '\.(bmp|png|tiff)$' <<< $file; then ... ; else ... ; fi
Název: Re:Automatická akce složky
Přispěvatel: Cuore 09 Března 2013, 11:11:44
Citace
Inotify a vlastní akce založené na událostech ve filesystému
přiznám se, že jsem výraz "macovský automator" slyšel poprvní v životě  ::) a navíc jsem byl v noci v práci, tak nebyl čas se dloubat v příkazech a googlu  :D takže to doženu. GdH sice tvůj blog čtu, ale tohle jsem vypustil, asi proto, že titulek inotify mi nic neřekl  ;D
Název: Re:Automatická akce složky
Přispěvatel: Welblaud 09 Března 2013, 11:16:10
No ten příspěvek jsem právě neminul  :) Z něj jsem vycházel.

Automator je prostě něco jako v linuxu Xpresser nebo Actionaz, jen na mnohem přívětivější úrovni.
Název: Re:Automatická akce složky
Přispěvatel: GdH 09 Března 2013, 11:46:16
.. asi proto, že titulek inotify mi nic neřekl  ;D

To mě u tebe překvapuje, že bys nebyl zvědavej :)
Název: Re:Automatická akce složky
Přispěvatel: Cuore 09 Března 2013, 17:10:45
.. asi proto, že titulek inotify mi nic neřekl  ;D

To mě u tebe překvapuje, že bys nebyl zvědavej :)
díky za poklonu... snažím se  ::)
Název: Re:Automatická akce složky
Přispěvatel: Welblaud 10 Března 2013, 21:01:49
Bohajeho!  :D Chtěl jsem si to trochu osahat, ale jak teď postoupit dál? Rád bych jednoduše > vem fotky > přetáhni do složky > změň velikost > prdni do adresáře s názvem, který zadáš > zazipuj. První část se mi po radách tady daří vcelku dobře, dokonce vytvořím adresář, zipovat složku to taky umí, ale jak udělat tu posloupnost, aby se to všechno vlastně zabalilo až nakonec? Možná na to jdu hodně zbrkle, ale... na konci bych to taky asi zazipoval, ale to naskládání do adresáře se $jménem se nějak nedaří, tam to dá je jednu fotku, navíc název zadávám tolikrát, kolik je fotek (tudíž to vytvoří jednou adresář, ten to pak chce pořád přepisovat...

Kód: [Vybrat]

#!/bin/bash
dir="$HOME/Plocha/fotkouzlo/"
inotifywait -qm -e close_write --format=%w%f "$dir" | while read file
do
           [[ $file =~ \.JPG$ ]] && convert "$file" -resize 60% "${file%JPG}jpg" && rm "$file"
&& jmeno=$(zenity --entry --text "Zadej jméno zipu: ") && mkdir ./fotkouzlo/"$jmeno" && mv ./fotkouzlo/*.jpg ./fotkouzlo/"$jmeno"
done


Název: Re:Automatická akce složky
Přispěvatel: GdH 10 Března 2013, 21:33:46
Tohle není schopné rozpoznat, že jsi tam dal jeden seznam souborů, to prostě reaguje na každý zapsaný soubor zvlášť. Leda bys tam přetáhl celý adresář. Pokud chceš dělat úpravu označených fotek, byla by lepší akce do Nautila: označíš soubory > z kontextového menu vybereš akci > a dál už to řeší skript, který dostane seznam souborů.
Název: Re:Automatická akce složky
Přispěvatel: GdH 10 Března 2013, 21:41:08
Jedině bys na to mohl navěsit skript, který by řešil nějaký timeout po každé události a dokud by nebyl překročen jen sbíral cesty, které by pak zpracoval najednou.

Mimochodem, proč to řešíš přes inotifywait, když pro tento účel by byl pohodlnější a spolehlivější incron, který jsem v článku také popsal.
Název: Re:Automatická akce složky
Přispěvatel: Welblaud 11 Března 2013, 07:59:44
Tak incron tedy zkouším, ale nedobírám se, možná protože když se ukládá konfigurace, zapisuje se automaticky někam do TEMPu, nevím proč a nevím, jestli bych to měl uložit někam jinam. Nedělá to vůbec nic.

Celý figl má spočívat v tom, že když mi rodiče, co oba používají XFCE, posílají fotky, mohli by je posílat prostě jako balík v zipu, a to zmenšený (kdo by neznal 15 příloh v mailu, každá 1MB  ;) ), takže ten slavný skript v nautilu by moc neupotřebili. Rád bych, aby to uživatelsky bylo co nejjednodušší. Vrtá mi hlavou, proč by tam nešlo udělat něco jako „až tohle všechno uděláš, práskni to do adresáře a ten zazipuj“. Nezavání to spíš nějakými dalšími podmínkami? (while, case atd.?)
Název: Re:Automatická akce složky
Přispěvatel: GdH 11 Března 2013, 09:44:26
Ok. V tomto případě opravdu bude lepší inotifywait, protože pořebuješ zpracovávat ta data postupně a incron by volal skript znova pro každý soubor, to jsem včera nedomyslel. Pokud bychom neřešili nějaké timeouty, mohlo by se to napsat tak, aby se to optalo na jméno budoucího zipu jen tehdy, pokud v adresáři žádný zip nebude a opačném případě do něj jen přidávat další soubory. Když to uživatel naplní, zip z adresáře přesune/smaže a příště celé od začátku.
Název: Re:Automatická akce složky
Přispěvatel: Welblaud 11 Března 2013, 09:59:34
No dobrá, ale jak?  :) Jak jsem psal, problém mám s tím, že se to vlastně ptá na jméno zipu u každého souboru. To by technicky asi šlo tak, že by se tam použilo něco jako >> přilepení na konec, jenže to je samozřejmě taky na houby.

Celé to asi má sestávat z následujícího:

1) zmenšení
2) smazání originálů
2) zeptat se na jméno zipu
3) zipovat všechny jpg ve složce a smazat originály

Původně jsem to zkoušel jen jako zip nakonec všeho ve složce, bez ptaní na jméno zipu. To fungovalo, i když to vlastně evidentně ty soubory do toho zipu strkalo postupně. To asi nevadí, v tuhle chvíli tedy vadí jen to, že se to ptá na jméno zipu, tam možná bude zakopanej pes. Když jsem to zipoval bez toho, zipovalo se to defaultně s názvem nadřazený složky, a to se mi nelíbí :)

Název: Re:Automatická akce složky
Přispěvatel: GdH 11 Března 2013, 10:16:27
Vždyť je to evidentní. Prostě přidáš podmínku, která při zpracování každého souboru zjistí, jestli zip soubor existuje a pokud ne, zeptá se na jméno a vytvoří ho. Pak do něj strkáš každý další zpracovaný soubor. Pochop, že nezpracováváš dávku, ale proud dat - každý soubor, jeden průchod smyčkou, každý soubor samostatné zpracování. Žádné ukidím nakonec, uklízet musíš průběžně.
Název: Re:Automatická akce složky
Přispěvatel: beer 11 Března 2013, 10:17:47

2) zeptat se na jméno zipu
3) zipovat všechny jpg ve složce a smazat originály


To zipování mi připadá jako naprosto zbytečné u obrázků. Prostro navíc tím nezískáš. Osobně bych si místo toho nastavil raději zálohování do cloudu, ale přímo těch obrázků. Google Docs, Picasa, Dropbox, Flickr, a pod. V případě třeba toho dropboxu si můžeš vygenerovat seznam přímých veřejných odkazů.
Název: Re:Automatická akce složky
Přispěvatel: Cuore 11 Března 2013, 10:21:52
to zipování nedělá z důvodu úspory místa, ale jako součást jednoduchého odeslání e-mailu  jen s jednou přílohou.... ;)
Název: Re:Automatická akce složky
Přispěvatel: beer 11 Března 2013, 10:24:34
to zipování nedělá z důvodu úspory místa, ale jako součást jednoduchého odeslání e-mailu  jen s jednou přílohou.... ;)

Hmm, tak mne přijít mail s obrázky v zipu, tak je snad ani nestahuji, když nevidím, co v nich je.
Výhodu v tom nevidím -  není vidět náhled obrázku v prohlížeči, práce navíc s rozzipováním, nemohu si selektivně vybrat, co chci stáhnout.

Přitom se dá poslat třeba jen seznam odkazů a obrázky se mohou poslat moderně přes cloud.

Například by to mohlo fungovat takto:
Kód: [Vybrat]
find *.jpg|while read line; do dropbox puburl "$line"; done > obrazky.txt
Ještě by to šlo určitě nějak upravit, aby místo obyčejného seznamu odkazů se generovala galerie s obrázky uloženými třeba na tom dropboxu a posílal by se jen index.html, případně by se galerie odeslala přímo ve formátu html e-mailem.
Název: Re:Automatická akce složky
Přispěvatel: Welblaud 11 Března 2013, 10:34:51
Jasně, Cuore má pravdu. Tohle se hodí, když se dva znají a pravidelně si posílají v přílohách mailu hromady fotek v původních velikostech. Pak na to koukají na mailu, pěkný si řeknou, a pak už se k tomu nikdy nedostanou, ani si to neuloží.

Ja jasné, že sdílet fotky lze hromadou způsobů, ale tady je vtip právě v tom, aby uživatel na druhé straně nemusel už vůbec nic jiného dělat, než to samé, na co je zvyklý (tj. jednoduchá práce se složkami a mailem).

Budu testovat.
Název: Re:Automatická akce složky
Přispěvatel: Welblaud 11 Března 2013, 10:59:31
Vždyť je to evidentní. Prostě přidáš podmínku, která při zpracování každého souboru zjistí, jestli zip soubor existuje a pokud ne, zeptá se na jméno a vytvoří ho. Pak do něj strkáš každý další zpracovaný soubor. Pochop, že nezpracováváš dávku, ale proud dat - každý soubor, jeden průchod smyčkou, každý soubor samostatné zpracování. Žádné ukidím nakonec, uklízet musíš průběžně.

Dobrý, tak nějak vágně to chápu, ale naprosto netuším, jak to udělat :) Pokud tím máš a mysli jiný typ cyklu, jsem ztracen  :-\
Název: Re:Automatická akce složky
Přispěvatel: GdH 11 Března 2013, 11:24:53
A tady bych vás prosil, abychom si předem stanovili úroveň na které se budeme pohybovat, já zde nebudu vysvětlovat takové běžné triviální pojmy, takové věci jako co je to parabřidlice nebo ortobřidlice já prostě předpokládám!

 ;D ;D ;D

Když bude čas a nálada, tak ti to třeba i napíšu :)
Název: Re:Automatická akce složky
Přispěvatel: pacholik 11 Března 2013, 12:03:01
A co takhle to postupným přidáváním (parametr -r) strkat do taru (bez komprese)
Kód: [Vybrat]
inotifywait -qm -e close_write --format=%w%f "$dir" | while read file; do
...
tar rf archiv.tar "$file"
done
Název: Re:Automatická akce složky
Přispěvatel: Welblaud 11 Března 2013, 12:56:44
Echm  :) , nejsem geolog.

Není to tak, že při každém dalším opakování potřebuju jen zadat proměnnou jména? Jako že zadej jméno při prvním, při druhém průchodu už tu proměnnou vlastně znám, tak ji zadávám automaticky?

Ano, tar bych rád, ale to by nesměl nikdo z rodiny posílat fotky windowsákům.

Nekonec na to možná rezignuju a zip bude pojmenován jen datem a příponou podle libosti.
Název: Re:Automatická akce složky
Přispěvatel: GdH 11 Března 2013, 17:53:31
Tak geologu, asi takto zhruba, první nástřel, zdá se, že funkční...

Kód: [Vybrat]
#!/bin/bash

dir="$HOME/Plocha/fotokouzlo"
[ -e "$dir" ] || mkdir -p "$dir"
cd "$dir"

inotifywait -qm -e close_write --format=%f "$dir" | while read file
do
if egrep -iq '\.(bmp|png|tiff|jpg)$' <<< $file; then
  if [ -e "$file" ]
    then
      convert "$file" -resize 60% "$file.jpg" && rm "$file"
      if [ -e *\.zip ]
        then
          jmeno=$(ls -1 | egrep -m1 '\.zip$')
        else
          jmeno=''
          while [ -z "$jmeno" ]
            do
              jmeno=$(zenity --entry --text "Zadej jméno zipu: ")
            done
      fi
      zip -m0Dj "$jmeno" "$file.jpg"
  fi
fi
done
Název: Re:Automatická akce složky
Přispěvatel: Welblaud 12 Března 2013, 14:37:28
Při zkoušení se mi ještě něco rýsuje, co tam může dělat potíž, dám vědět. Jedna věc je ověření, že tam zip je, druhá jsou názvy souborů > všiml jsem si, že když jsem měnil vztah testovaného názvu na začátku a dosazované proměnné ku konci, reagovalo to se zenity stejně jako při tom jednoduchém postupu ode mne. Ale dobrý, dobrý, už jsem podle toho udělal i pěkné akce do Thunaru  ;)

Jinak moc pěkná krevel :)
Název: Re:Automatická akce složky
Přispěvatel: GdH 12 Března 2013, 15:16:08
Moc ti nerozumím, ale dej vědět ;) V skriptu neřeším výměnu koncovek, prostě dostanou další. Naopak řeším to, že pokud se zkonvertuje obrázek, vyvolá to akci ještě jednu, když se zapíše výsledek. Zenity otravuje dokud nedostane nějaký řetězec, pokud zip není a ačkoliv testuju jakýkoliv zip v apresáři, kdyby jich tam bylo náhodou víc, bude se přidávat do toho abecedně prvního. Všechno to operuje v rámci jednoho adresáře a je jedno, kde se skript spustí. To je tak asi vše, co se k tomu dá říct.