Egy szkriptet kéne faragnom, ami úgy működik, hogy egy adott mappába beteszik a sok jpg képet, és azokat melyek nagyobbak mint 400kb, azokat átméretezné max 400kb-ra egy új néven. Ezt meg tudom oldani. Viszont sokszor lusták kitörölni a már elkészült kisebb méretű jpg képeket, és újra elindítják a scriptet. S ekkor újra generálódik a már létező kis kép újabb néven.
Most ez van:
for files in *.jpg *.JPG; do
convert -verbose ${files} -define jpeg:extent=400kb k_${files}
done
Hogy álljak neki? find kellene, if then? De bele lehet tenni egy ciklus közepébe? Esetleg helyezzem át az origin, és a kis képeket egy külön mappába a munka végén?
Hozzászólások
Ezek az operátorok nem segítenek? http://www.imagemagick.org/script/command-line-processing.php#geometry
“Any book worth banning is a book worth reading.”
Sz*rk: Leesett, mi volt a problémád. Javítva. Elpasszolja a
'k_'
prefixált képeket, hogy azokból ne csináljon thumbot, a többinél meg ellenőrzi, hogy van-e thumb és csak akkor generál, ha nincs.Oldschool Computer - http://oscomp.hu
Köszi, de végül is annál maradtam hogy külön mappákat használok. Egyszerűbb az élet. Viszont hadd kérdezzem meg: Ennek az érdekes jelnek a jelentőségét: `
Az echo elé tetted. Mi a neve? Ahogy olvasgattam a különböző ajánlásokat, úgy láttam hogy ezt el kellene kerülni. Helyette a $( ) opció a javasolt. Mondjuk beírni is könnyebb ez utóbbit.
ASCII 96: grave accent/backtick/backquote. Ez ugyanaz a parancsbehelyettesítés, mint a
$()
, csak épp máshogy kezelődik le.A
$()
esetén a nyitó$(
után minden karakter úgy lesz része a parancsnak, ahogy oda van írva, egészen az ellenpár - ellenpár és nem következő! -)
karakterig, tehát minden további nélkül lehet őket egymásba ágyazni, míg a backquote-os esetén viszont a beágyazott backquote-os substitution-öket escape-elni kell, különben a belső beágyazott substitution megkezdése helyett lezárod vele a külső, már nyitott substitution-t és totál nem azt fogod csinálni, amit akartál.Ez mondjuk még nem lenne olyan nagy probléma, de ha a substituion-ön belüli substitution-ben is szükséged lenne egy harmadikra, akkor azt is escape-elni kell, de úgy, hogy az escape-elést is escape-elni kell, különben nem a harmadikat nyitod ki, hanem a másodikat zárod le. Azaz pl:
`elso sub eleje \` masodik sub eleje \\\`harmadik sub\\\` masodik sub vege \` elso sub vege`
Azaz, ahanyadik nesting szinten jársz, a backquote-jaid elé(2 * szint) + 1
backslash karaktert kell pakolni.Namármost, ez így nyilván rosszul hangzik, de az, hogy "ezt el kellene kerülni" ez már megint egy olyan dogma, mint az, hogy a
goto
az ördögtől való.Egyfelől, egy
$(cat x)
és`cat x`
között semmi különbség nincsen, viszont a backtickes verzió egy karakterrel rövidebb és angol billentyűzeten (amit világszinten azért gyakrabban használnak a shellscript írók, mint a magyart) speciel könnyebb beírni is; még SHIFT se kell hozzá, a másikkal ellentétben. Nyilván, amikor már a huszadik nestingnél jársz, akkor írja be a hóhér azt a rengeteg visszaperjelet, de egy egyszintes substitution-nél (ami az esetek elsöprő többségében az use-case), nincs gáz vele.Másfelől, a
$()
esetében előállhat olyan eset, hogy dupla zárójellel nyit a substitution (értsd:$((
), ami jelentheti azt is, hogy itt egy substitution, ami subshellel indít, de jelenthet aritmetikai kifejezést is és ez pedig arra fogja kényszeríteni a shell-t, hogy először próbálja meg aritmetikailag értelmezni a kódot, mielőtt behelyettesítene, ami lassítja a végrehajtást. Persze, ha nem aritmetikai kifejezést írsz, akkor célszerű egy szóközt bevágni a két zárójel közé és akkor nincs ez a kétértelműség, de ezt véletlenül is leírhatod így és mivel a kódod így is menni fog, így nem biztos, hogy észreveszed, míg a`(
esetén ilyen kétértelműség nincsen.Ezen felül, a backquote a classic POSIX substitution, a
$()
aksh
újítása, ami ugyan mára már szintén része a POSIX-nek, de ha valami baromi régi shell-be ütközöl, akkor muszáj a backquote-et használni, mert nincs más.Hogy én miért azt használtam itt? Megszokásból. Semmi más oka nincsen.
Oldschool Computer - http://oscomp.hu
A hasonlót én úgy oldottam meg, hogy külön van az input és az output könyvtár. Lehetne még bűvészkedni a fájlméret ellenőrzésével is akár, de minek bonyolítani?
Pont így. Forrasmappa alapján a celmappaba csinálja és az elkészült képeket egy archive-ba mozgatja.