Fájlok metaadatainak olvasása, írása, másolása az ExifTool programmal (3. oldal)

botond küldte be 2019. 06. 15., szo – 16:55 időpontban

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.

A munkakönyvtárak beállításánál az útvonalak végére ne tegyünk "/" jeleket, mert a program további részeiben a string összefűzések már tartalmazni fogják ezeket is.

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.

Mivel az egész program arra épül, hogy az automatizált munkafolyamatunkban szereplő JPG fájlokba már korábban belekerültek az IPTC adatok, ezért itt további JPG fájl IPTC ellenőrzést nem végzünk.

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:

ExifTool - Példaprogram működés közben

Ha pedig véletlenül lefuttatnánk újra ugyanazokon a fájlokon, akkor pedig kihagyja a már IPTC-t tartalmazó fájlokat:

ExifTool - Példaprogram működés közben - Második futtatás

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ó

Ez a leírás több oldalból áll: