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
-
Rozhodl jsem se zkusit napodobit automatickou akci složky z macovského automatoru. Nedaří se mi ale překonat typické neznalosti...
#!/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?
-
> 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é.
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
convert "$file" "${file%.bmp}.jpg"
-
Tak teď už se jen dostat přes
convert: unable to open image `{/home/honzuska/Plocha/jpg2bmp/WildWheat_by_Brian_Burt.jpg%bmp}.jpg': @ error/blob.c/OpenBlob/2587.
:)
-
Tak teď už se jen dostat přes 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.
-
k čemu to je dobré?? ::) můžeš se trochu rozepsat ;) díky
-
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.)
-
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 ;)
-
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.
-
[[ $file =~ \.(bmp|png|tiff)$ ]]
"${file%.*}.jpg"
-
Pěkně, díky moc, budu zkoušet.
-
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:
if egrep -iq '\.(bmp|png|tiff)$' <<< $file; then ... ; else ... ; fi
-
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
-
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.
-
.. asi proto, že titulek inotify mi nic neřekl ;D
To mě u tebe překvapuje, že bys nebyl zvědavej :)
-
.. 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 ::)
-
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...
#!/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
-
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ů.
-
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.
-
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.?)
-
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.
-
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í :)
-
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ě.
-
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ů.
-
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.... ;)
-
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:
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.
-
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.
-
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 :-\
-
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 :)
-
A co takhle to postupným přidáváním (parametr -r) strkat do taru (bez komprese)
inotifywait -qm -e close_write --format=%w%f "$dir" | while read file; do
...
tar rf archiv.tar "$file"
done
-
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.
-
Tak geologu, asi takto zhruba, první nástřel, zdá se, že funkční...
#!/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
-
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 :)
-
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.