képek kicsinyítése

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

Szerkesztve: 2020. 12. 13., v – 22:26
for files in *.jpg *.JPG;
do
	if [ `echo ${files} | cut -d'_' -f1` != "k" ];
	then
		if [ ! -f k_${files} ];
		then
			convert -verbose ${files} -define jpeg:extent=400kb k_${files}
		fi
	fi
done

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.

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 $() a ksh ú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.

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?