A 3. oldal tartalma
Folytatás
Az előző oldalon megismerhettük az exiftool parancs írási és másolási funkcióit, valamint egyéb fájlformátumokkal is kipróbáltuk a metaadatok kiolvasását, ezen az oldalon pedig összeállítunk egy komplett, működő automatizáló shell scriptet, ami a megadott könyvtárban lévő JPG fájlok IPTC adatait másolja át a másik könyvtárban lévő EPS fájlokba.
Történet
Az egész leírás elkészítésének van egy kis története, melyet ha itt röviden leírok, könnyebb lesz megérteni a példaprogram miértjét és a működését is. A történet lényege annyi, hogy ikonokat tartalmazó vektorokat készítek, amiket stock oldalakra töltök fel eladás céljából. Akik ismerik ezeket az oldalakat, azok tudják miről van szó, akik nem, azoknak elég csak annyi, hogy az egyik stock oldal (Shutterstock) körülbelül egy hónapja új vektor feltöltési szabállyal állt elő, miszerint már nem kell JPG előnézeti képfájlokat feltölteni a vektorokhoz (amiben korábban voltak az IPTC adatok is), hanem csak önmagában az EPS vektorfájlokat.
A probléma
Ez az újítás megnehezíti a feltöltők dolgát, mivel a legtöbben eddig JPG képek IPTC rekordjaiban juttatták fel az oldalra a vektorok leírását és kulcsszavait. A változtatás óta pedig ezeket az adatokat most az EPS fájlokba kell ágyazni. Mindezzel annyi a probléma, hogy akik automatizáltan és nagyobb mennyiségben töltöttek fel vektorokat, azoknál jelentősen lelassul a munkafolyamat az EPS fájlok kézzel történő kitöltögetésével.
A megoldás
A megoldás lehet például egy olyan automatizáló script, amit a meglévő munkafolyamatunkba tudunk beilleszteni anélkül, hogy változtatnunk kellene a többi oldalra történő feltöltés menetén. A feladat mindössze annyi, hogy a már meglévő, kulcsszavazott JPG fájlok IPTC adatait automatizáltan átmásoljuk az ugyanolyan névvel lementett EPS fájlokba, hogy azokat ne kelljen újra kézzel kitölteni az oldalra történő feltöltés után.
IPTC adatokat másoló script elkészítése
Alapciklus
Miután megismerkedtünk az exiftool paranccsal, innentől a feladat roppant egyszerűvé válik és a scriptünk sem lesz bonyolult, melynek alapját egy while ciklus adja, ami egy csővezetékből kapja a fájlneveket a find parancstól a megfelelő munkakönyvtárból:
1 2 3 4 5 6 7 8 9 10 #!/bin/bash # EPS munkakönyvtár beállítása WORK_EPSDIR="/eps/munkakonyvtarunk/elerese" # A végén nincs "/" jel! # Fő ciklus find $WORK_EPSDIR -maxdepth 1 -name "*.eps" -type f | while read filename; do [...] done
Az EPS munkakönyvtár tartalmazza a cél EPS fájlokat, amikbe átmásoljuk a szükséges IPTC adatokat. Első körben ezeken a fájlokon kell végighaladnunk.
Azonos nevű JPG fájlok keresése
A következő lépésben a cikluson belül a JPG munkakönyvtárban keressük meg az EPS fájllal azonos nevű JPG fájlt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/bin/bash # EPS és JPG munkakönyvtárak beállítása WORK_EPSDIR="/eps/munkakonyvtarunk/elerese" # A végén nincs "/" jel! WORK_JPGDIR="/eps/munkakonyvtarunk/elerese" # A végén nincs "/" jel! # Fő ciklus find $WORK_EPSDIR -maxdepth 1 -name "*.eps" -type f | while read filename; do basename=$(basename $filename) # Kinyerjük csak a fájl nevét basename=${basename%.*} # Leszedjük annak a kiterjesztését is. jpgfile=$WORK_JPGDIR/$basename.jpg # a megfelelő jpg fájlnév összeállítása # JPG fájl meglétének vizsgálata a JPG könyvtárban if [ -f $jpgfile ] ; then # Ha megvan az azonos nevű JPG fájl, akkor [...] else # Ha nincs meg, akkor [...] fi echo done
A script elejére bekerült a JPG munkakönyvtár beállítása is. Ez lehet akár ugyanaz a könyvtár is, mint az EPS fájlokat tartalmazó könyvtár, de így a program rugalmasabb, ha külön könyvtárakat is be lehet neki állítani.
Majd 10-12. sorban az EPS fájl nevéből előállítjuk az azonos nevű JPG fájlnevet a JPG munkakönyvtár megadásával és a kiterjesztés lecserélésével.
Ezután jön egy if szerkezet a fájl meglétének vizsgálatával.
IPTC ellenőrzése az EPS fájlokban
Ha az előző rész megtalálta a megfelelő JPG fájlt – azaz megvan az alapfeltétele az adatok átmásolásának – akkor itt elvégzünk még egy ellenőrzést, amiben megvizsgáljuk, hogy került-e már korábban IPTC adat az EPS fájlba. Ez a rész nem létfontosságú, de ezzel megakadályozhatjuk, hogy a program többszöri futtatására újra beleírja (feleslegesen) az IPTC adatokat.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #!/bin/bash # EPS és JPG munkakönyvtárak beállítása WORK_EPSDIR="/eps/munkakonyvtarunk/elerese" # A végén nincs "/" jel! WORK_JPGDIR="/eps/munkakonyvtarunk/elerese" # A végén nincs "/" jel! # Fő ciklus find $WORK_EPSDIR -maxdepth 1 -name "*.eps" -type f | while read filename; do basename=$(basename $filename) # Kinyerjük csak a fájl nevét basename=${basename%.*} # Leszedjük annak a kiterjesztését is. jpgfile=$WORK_JPGDIR/$basename.jpg # a megfelelő jpg fájlnév összeállítása # JPG fájl meglétének vizsgálata a JPG könyvtárban if [ -f $jpgfile ] ; then # Ha megvan az azonos nevű JPG fájl, akkor output=$(exiftool -IPTC:Caption-Abstract $filename) # Kiolvassuk az EPS fájl IPTC tartalmát egy változóba if [[ ${#output} = 0 ]] ; then # Ha még nincs benne IPTC adat, akkor [...] else # Ha már van benne IPTC adat, akkor [...] fi else # Ha nincs meg, akkor [...] fi echo done
Az új részben (16-21. sor) először egy subshell-ben (a while ciklus ciklusváltozójában lévő EPS fájlon) lefuttatott exiftool IPTC:Caption mezőjének kiolvasási eredményét nyerjük ki egy változóba, majd annak karakterhosszát vizsgálva döntjük el, hogy van-e benne adat. Ha a kiolvasott mezőnk 0 hosszúságú, akkor az EPS fájlban még nincs IPTC adat, ilyenkor mehet is tovább a folyamat.
JPG IPTC adatainak másolása az EPS fájlba
Ha idáig eljutott a programunk vezérlése, akkor jöhet is a lényeg: az IPTC adatok átmásolása a "megtalált" JPG fájlból a ciklus tárgyát képező EPS fájlba (19. sor):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #!/bin/bash # EPS és JPG munkakönyvtárak beállítása WORK_EPSDIR="/eps/munkakonyvtarunk/elerese" # A végén nincs "/" jel! WORK_JPGDIR="/eps/munkakonyvtarunk/elerese" # A végén nincs "/" jel! # Fő ciklus find $WORK_EPSDIR -maxdepth 1 -name "*.eps" -type f | while read filename; do basename=$(basename $filename) # Kinyerjük csak a fájl nevét basename=${basename%.*} # Leszedjük annak a kiterjesztését is. jpgfile=$WORK_JPGDIR/$basename.jpg # a megfelelő jpg fájlnév összeállítása # JPG fájl meglétének vizsgálata a JPG könyvtárban if [ -f $jpgfile ] ; then # Ha megvan az azonos nevű JPG fájl, akkor output=$(exiftool -IPTC:Caption-Abstract $filename) # Kiolvassuk az EPS fájl IPTC tartalmát egy változóba if [[ ${#output} = 0 ]] ; then # Ha még nincs benne IPTC adat, akkor # IPTC adatok átmásolása a $jpgfile -ból az EPS fájlba exiftool -overwrite_original -tagsFromFile $jpgfile -IPTC $filename else # Ha már van benne IPTC adat, akkor [...] fi else # Ha nincs meg, akkor [...] fi echo done
Itt tehát egyetlen másoló paranccsal átmásoljuk az összes IPTC adatot a JPG fájlból az EPS fájlba. Így nem kell külön bíbelődnünk a megfelelő Caption, keywords, stb mezőkkel, hanem mindent átmásolunk. Továbbá a korábban már ismertetett -overwrite_original kapcsoló segítségével gondoskodunk róla, hogy ne maradjon szemét a munkakönyvtárunkban.
Ezzel tehát a programunk már működőképes is, már majdnem készen van, de még hátravan a kimenet kezelése.
Kimenet kezelése, színek használata
Ezt a részt direkt a végére hagytam, mert nem csak simán kiírunk dolgokat, hanem színeket is használunk a program által generált kimenetekben, hogy áttekinthetőbb legyen a program a működése során.
A programban a tput parancs segítségével állítjuk a színeket – amiket előre változókban tárolunk – hogy utána már kényelmesen kapcsolgathassuk a színeket a kimenetre írás közben:
1 2 3 4 5 6 7 8 9 [...] # Kiemelőszínek definiálása green=$(tput setaf 2) # Zöld kiemelőszín red=$(tput setaf 1) # Piros kiemelőszín cyan=$(tput setaf 6) # Cián kiemelőszín reset=$(tput sgr0) # alapállapot visszaállítása [...]
1 2 3 [...] echo "${green}Zöld szövegrész${reset}" [...]
Ezeket felhasználva, a programunk a következőképpen alakul.
Végső állapot
A végső állapotában a programba bekerülnek tehát a színes kimenetre írások is:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #!/bin/bash # EPS és JPG munkakönyvtárak beállítása WORK_EPSDIR="/eps/munkakonyvtarunk/elerese" # A végén nincs "/" jel! WORK_JPGDIR="/eps/munkakonyvtarunk/elerese" # A végén nincs "/" jel! # Kiemelőszínek definiálása green=$(tput setaf 2) # Zöld kiemelőszín red=$(tput setaf 1) # Piros kiemelőszín cyan=$(tput setaf 6) # Cián kiemelőszín reset=$(tput sgr0) # alapállapot visszaállítása # Fő ciklus echo ${cyan} echo "******************************************************" echo "EPS fájlok IPTC adatainak bemásolása a JPG fájlokból" echo "******************************************************" echo ${reset} find $WORK_EPSDIR -maxdepth 1 -name "*.eps" -type f | while read filename; do basename=$(basename $filename) # Kinyerjük csak a fájl nevét basename=${basename%.*} # Leszedjük annak a kiterjesztését is. jpgfile=$WORK_JPGDIR/$basename.jpg # a megfelelő jpg fájlnév összeállítása printf "${cyan}Fájl: $basename.eps${reset} " # JPG fájl meglétének vizsgálata a JPG könyvtárban if [ -f $jpgfile ] ; then # Ha megvan az azonos nevű JPG fájl, akkor printf "${green}JPG-t megtaláltam, EPS IPTC ellenőrzése...${reset} \n" output=$(exiftool -IPTC:Caption-Abstract $filename) # Kiolvassuk az EPS fájl IPTC tartalmát egy változóba if [[ ${#output} = 0 ]] ; then # Ha még nincs benne IPTC adat, akkor # IPTC adatok átmásolása a $jpgfile -ból az EPS fájlba exiftool -overwrite_original -tagsFromFile $jpgfile -IPTC $filename else # Ha már van benne IPTC adat, akkor printf "Az EPS már tartalmazza az IPTC adatokat, fájl kihagyása..." fi else # Ha nincs meg, akkor printf "${red}JPG nincs meg! Fájl kihagyása.${reset} " fi echo done
Végül a printf illetve echo kezdetű sorokkal jelezzük a programban történteket.
Működés közben
Néhány próbafájlon lefuttatva pedig így néz ki első futtatásra:
Ha pedig véletlenül lefuttatnánk újra ugyanazokon a fájlokon, akkor pedig kihagyja a már IPTC-t tartalmazó fájlokat:
Ez az ellenőrzési funkció például akkor jöhet igazán jól, ha van egy nagy gyűjtő könyvtárunk, amiben vegyesen vannak a régi EPS fájlok, és a még fel nem dolgozottak, így a többszöri, szakaszokban történő futtatásoknál csak az újakhoz nyúl hozzá. Ezzel időt is spórolunk, mert az IPTC ellenőrzésével járó olvasási művelet gyorsabb, mint az adatok (újbóli) fájlba írása.
A program természetesen akármennyi fájlal működik, tehát ha ráeresztjük mondjuk egy 10 000 darab EPS-t tartalmazó könyvtárra, akkor is szépen megcsinálja a másolásokat, csak nyilván több idő alatt.
Konklúzió
Ez lenne tehát az ExifTool program és parancs átfogó (de nem mindenre kiterjedő) bemutatása, aminek az elkészítésére elsősorban a Shutterstock-on történt változtatások inspiráltak. Mivel nem akartam egyből a közepébe ugrani, ezért a leírás első két oldalán a program alapvető használatával foglalkoztunk.
Bár a példaprogram eléggé specifikus, szűk körben felhasználható eszköz, kis átalakításokkal talán hasznos lehet más feladatok elvégzésére is.
Lapozó
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
- 55 megtekintés