Fotosjov med exiftool på Linux-kommandolinjen

Det sker fra tid til anden at jeg er ude og fotografere. Det synes jeg at sjovt, og jeg er en glad amatør :-)
Jeg ved også at det jeg har sværest ved at fotografere godt er indendørs karate-stævner. Der er ofte dårligt lys, og jeg må ikke bruge blitz når jeg "skyder" de unge i kamp.
I går fik jeg taget 1645 billeder med tre forskellige objektiver, og i dag er det lidt sjovt at lave lidt status på billederne.
Hvor meget brugte jeg de forskellige objektiver og hvor tæt fokuserede jeg i praksis?
Det er oplagt at jeg kan bruge den type informationer til at vælge objektiver fremadrettet.
Det er vist en dødsejler, at få overblik over så mange billeder på Windows, men på en Linux-maskine med lidt kommandolinie-gymnatisk er det ret nemt. Jeg giver et par eksempler på dette og niveauet bliver meget "hands-on".

Til at kigge status på billederne er "exiftool" et meget enkelt værktøj til at se information om hvert billede.
På et billede f.eks. DSC_2681.JPG er det nemt at se data

$ exiftool DSC_2681.JPG | wc --lines
190

For hvert billede taget med mit Nikon D3100 kamera er der således 190 linier gemt med information om dato, billed-størrelse, åbningstid, fokus, objektiv-data osv.
Den nemmeste måde at se hvilke information der findes er at pipe informationerne over i "less" og bruge op og ned pil til at gå frem og tilbage (og "q" for at afslutte)

$ exiftool DSC_2681.JPG | less

F.eks. kan jeg finde et par linier med objektiv-information

Lens ID                         : AF-S VR Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED
Lens                            : 24-85mm f/3.5-4.5 G VR

For at hvilke objektiver jeg bruge mest så er det nemt nok. Exittool kaldes med alle Jpeg billeder (*.JPG) og grep bruges til at tage de linier ud der indeholder "Lens ID". Sorter linierne og med "uniq -c"
vises hvor mange linier, som har de enkelte tekster.

$ exiftool *.JPG | grep "Lens ID  " | sort | uniq -c
    196 Lens ID                         : AF-S DX Nikkor 35mm f/1.8G
   1329 Lens ID                         : AF-S VR Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED
    120 Lens ID                         : Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD (B008)

Dvs. jeg tog 1329 billeder med min Nikkor 24-85mm objektiv og "kun" 196 med min (fantastiske) Nikkor 35 mm, og 120 med Tamron.

En af de andre sjove ting er at se fordelingen af "Focal Length", dvs. zoom-niveau.

$ exiftool * | grep "Focal Length"
Focal Length                    : 24.0 mm
Min Focal Length                : 24.5 mm
Max Focal Length                : 84.8 mm
Focal Length In 35mm Format     : 36 mm
Focal Length                    : 24.0 mm (35 mm equivalent: 36.0 mm)
Focal Length                    : 24.0 mm
Min Focal Length                : 24.5 mm
Max Focal Length                : 84.8 mm
Focal Length In 35mm Format     : 36 mm
Focal Length                    : 24.0 mm (35 mm equivalent: 36.0 mm)
Focal Length                    : 24.0 mm
Min Focal Length                : 24.5 mm
Max Focal Length                : 84.8 mm
Focal Length In 35mm Format     : 36 mm
Focal Length                    : 24.0 mm (35 mm equivalent: 36.0 mm)
...

Det var ikke helt godt nok - der kommer fem linier ud per billede med "Focal Length". For at kræve at "Focal Length" står først på linjen laver jeg i stedet grep efter "^Focal Length" og med "grep -v equivalent" udelader jeg nu linjer med dette ord. Tilsvarende for linjerne med "In 35 mm Format:

$ exiftool * | grep "^Focal Length" | grep -v equivalent | grep -v "In 35mm Format"
Focal Length                    : 52.0 mm
Focal Length                    : 46.0 mm
Focal Length                    : 24.0 mm
Focal Length                    : 75.0 mm
Focal Length                    : 75.0 mm
...

Endelig er jeg ved målet. Jeg klistrer en ekstra "sort" på for at sortere og en "uniq -c" for at tælle hvor mange unikke linier, der er.

exiftool * | grep "^Focal Length" | grep -v equivalent | grep -v "In 35mm Format" | sort -n | uniq -c
      2 Focal Length                    : 110.0 mm
      2 Focal Length                    : 130.0 mm
      2 Focal Length                    : 140.0 mm
      1 Focal Length                    : 170.0 mm
      1 Focal Length                    : 18.0 mm
      1 Focal Length                    : 185.0 mm
...

Ikke godt nok. Det er noget rod, at 18 mm står mellem 170 og 185 mm.
Der skal lidt ekstra gymnastik med "cut -d : -f 2" for får det andet felt klippet ud med kolon som adskiller-tegn.
og "mm" teksten kan slettes med "cut -d m -f 1" dvs. skil på "m" og tag det første del ud

exiftool * | grep "^Focal Length" | grep -v equivalent | grep -v "In 35mm Format" | cut -d : -f 2 | cut -d m -f 1 | sort -n | uniq -c
     1  18.0 
      6  23.0 
    288  24.0 
     11  26.0 
      4  27.0 
     15  28.0 
     24  29.0 
      2  30.0 
     15  31.0 
     68  32.0 
     36  34.0 
    225  35.0 
     34  36.0 
     42  38.0 
     75  40.0 
     60  42.0 
     21  44.0 
     31  45.0 
     67  46.0 
     74  48.0 
     58  50.0 
     93  52.0 
     40  55.0 
     41  56.0 
     52  58.0 
      1  60.0 
     47  62.0 
     24  65.0 
     22  66.0 
     14  68.0 
     16  70.0 
     20  72.0 
     11  75.0 
     11  78.0 
     21  80.0 
     55  85.0 
      1  92.0 
      2  110.0 
      2  130.0 
      2  140.0 
      1  170.0 
      1  185.0 
      1  220.0 
     10  270.0 

Stort set alle skud er taget i området 24-70mm, og vil man have lidt mere detalje, så kan jeg bruge en af de mange kommando-linje statistik-pakker såsom histogram.py

dvs en middelværdi på 45 mm for den afstand jeg nu var på karatekæmperne og lagt de fleste er taget i området 18-43 mm.

I får lige et billede til slut. Min datter Louise mod Melanie og jeg kan slet ikke få mit ben så højt op som Melanie kan :-)

Illustration: Privatfoto

/pto

P.S. Dette blog-indlæg kan med fordel læses sammen med dette.

Kommentarer (20)
sortSortér kommentarer
  • Ældste først
  • Nyeste først
  • Bedste først
Dmitri Popov

I stedet for at bruge grep, kan man med fordel bruge ExifTools -focallength parameter. Og man kan bruge -T til at vise data som en tabel (denne funktion kan bruges til f.eks. exportere EXIF-data ind i en regneark).

[shameless plug] Der findes i øvrigt en ebog om ExifTool skrevet af undertegnede.

P.S. s/linse/objektiv/ ;-)

  • 8
  • 0
Ole Kaas

Umiddelbart ligner det data det ville være lettere at hælde ind i et regneark og filtrere der. Så kan kommandoerne i vid udstrækning erstattes af museklik.

Det kommer nok an på hvad man er vant til at bruge - jeg ved ikke hvor jeg skal klikke med musen. Det lækre ved awk, sed, grep osv er at man netop blot bygger et filter hvor man stopper de rå data ind i den ene ende og får sin rapport ud i den anden. Kommer man i tanke om at man gerne vil have samme rapport på sine 1756 øvrige mapper med billeder, er det en smal sag at slippe filteret løs på dem også. Jeg bliver træt bare ved tanken om at skulle få et regneark til (automatisk) at udføre samme manøvre.

  • 14
  • 0
Maciej Szeliga

...samme rapport på sine 1756 øvrige mapper med billeder, er det en smal sag at slippe filteret løs på dem også. Jeg bliver træt bare ved tanken om at skulle få et regneark til (automatisk) at udføre samme manøvre.

Når det eneste værktøj man kender er en hammer så ligner alt et søm... det gælder også for regneark og især Excel.

  • 8
  • 0
Hans Henrik Jakobsen

Regneark kan slet ikke følge med når sammenligner med shell.

Det er simpelthen fantastisk de muligheder man til at analysere og omdøbe filer med GNU tools.

Har brugt gphoto2/exiftool det til at hente filer fra kameraet og organisere som det passer mig.

I starten syntes jeg det da drøn besværligt, men har fundet nemt efter jeg har fået lavet nogle scripts som kan organisere efter kamera, linse, dato etc.

Jeg kan i Corel Aftershot organisere dem efter begivenheder eller foto opgave e.g natur, macro, landscape, Lis og Børges bryllup 30/2 1990 etc.

Så alt i alt bruger jeg både shell tools og gui tools til at opnår endnu bedre sortering og organisering af mine billeder.

(Har næsten 100.000 billeder at holde styr på)

  • 2
  • 0
Andreas Andersen

Det kommer nok an på hvad man er vant til at bruge - jeg ved ikke hvor jeg skal klikke med musen. Det lækre ved awk, sed, grep osv er at man netop blot bygger et filter hvor man stopper de rå data ind i den ene ende og får sin rapport ud i den anden. Kommer man i tanke om at man gerne vil have samme rapport på sine 1756 øvrige mapper med billeder, er det en smal sag at slippe filteret løs på dem også. Jeg bliver træt bare ved tanken om at skulle få et regneark til (automatisk) at udføre samme manøvre.

Det lækre ved regnearket er at man hele tiden har overblik over data og man kan markere rækker og lave grafer og pivottabeller som man har lyst med ren point and click. Filtrering er et spørgsmål om at højreklikke på kolonnen og sætte et filter op, det kræver ikke at man på forhånd ved hvad man skal gøre, det kræver kun at man har en grundlæggende forståelse for det dersens it. Kommandolinjen kræver derimod at man skal huske en masse kommandoer. For den gennemsnitlige amatørfotograf tror jeg Excelløsningen er væsentligt lettere at have med at gøre.

  • 0
  • 7
Christian Nobel
  • 6
  • 1
Martin Regner Larsen

Det er vist en dødsejler, at få overblik over så mange billeder på Windows, men på en Linux-maskine med lidt kommandolinie-gymnatisk er det ret nemt.

Det er en fin artikel, men jeg synes det jap mod Windows trækker noget ned. Især når det ikke er sandt. Exiftool virker glimrende på Windows og PowerShell kan lave de samme manipuleringer. Alternativt kan man kalde en .net-assembly fra PowerShell og få data ud som objekter og undgå at rode med at klippe tekststrenge op med "cut".

Jeg kan være enig i betragtningen omkring overblikket ved brug af GUI vs CLI, men jeg ser ingen grund til hvorfor man skal gøre det til Windows vs Linux.

  • 10
  • 2
Hans Henrik Jakobsen

Jeg vil give dig ret i at Windows kan det samme, jeg ville dog fortrække installere Cygwin istedet :).

PowerShell har aldrig rigtigt fanget mig, jeg finder det noget rodet magværk (Nok fordi jeg ikke gider sætte mig ordenligt ind i det).

Da MS kom med vbscript brugte jeg det en del til at løse de samme problemer som jeg gør med GNU, men det er bare ikke rigtigt det samme, selv om jeg dog var glad for mulighederne.

Det jeg finder genialt ved GNU er, at det selvstændige programmer som kan arbejde sammen og de har været udviklet over så mange år, at der er ikke et problem som man ikke kan løse (næsten).

MS har aldrig rigtigt forstået ideen med en gode shell med masser af nyttige tools.

Nogle gang opstår der bare problemer som et GUI tools ikke har tænkt. Der er en kæmpe fordel at have masse tools som kan bindes sammen på de mest utænkelige.

Jeg ved godt at Powershell/vbscript kan interface til andre komponenter, men manualen til disse komponenter følger ofte ikke med komponenten så de er besværlige at bruge.

Jeg har det lidt som at Windows er en 3D printer og kan lave alt ud af plastik, GNU er alt det værktøj som kan lave det samme bare i træ, plastik eller metal.

  • 6
  • 3
Mogens Hansen

Det er et meget sjovt eksempel på styrken i at kunne sætte forskellige programmer sammen efter behov med pipes. Det er et stærk koncept.

Men hvis øvelsen går ud på at arbejde effektivt med store mængder foto er det værd at kigge på Adobe Photoshop Lightroom. Det er dog hverken gratis (men heller ikke dyrt) eller kører på Linux (kun Mac og Windows).
Den bruger på en database, hvor man simpelt kan hive denne slags information ud via den grafiske brugerflade.
Først og fremmest er Lightroom dog et billedbehandlingsprogram, til redigering af store mængder billeder.

  • 1
  • 1
Uffe Seerup

PowerShell har aldrig rigtigt fanget mig, jeg finder det noget rodet magværk (Nok fordi jeg ikke gider sætte mig ordenligt ind i det).

Jeg antager du mener makværk? I givet fald er jeg meget uenig: PowerShell er langt mere konsistent end bash. Der er tænkt over forudsigelighed, og der er langt færre overraskelser, ikke mindst fordi det ikke er så nødvendigt med så meget tekstjonglering som iøvrigt illustreres fint af denne blogpost.

Det jeg finder genialt ved GNU er, at det selvstændige programmer som kan arbejde sammen og de har været udviklet over så mange år, at der er ikke et problem som man ikke kan løse (næsten).

Det er også ret smart. Det som tilsvarende er "genialt" ved PowerShell er, at der findes objektmodeller i Windows som gælder for hele systemet, og som gør, at PowerShell kan benytte de komponenter som selvstændige programmer er skruet sammen af. Disse komponenter er ofte mindre end egentlige programmer. Hvor der skal laves særligt scripting interface til unix tool modellen, kan PowerShell anvende komponenter som er lavet før nogen har tænkt på PowerShell. Fordi disse programmer (som fx. Word, Photoshop, Excel etc) er stykket sammen af COM objekter kan de bruges fra PowerShell.

Eksempelvis kan de handlinger som findes i oveenstående fint udføres ved at benytte komponenter (COM klasser) fra Windows Image Acquisition Layer. Se fx denne blogpost: http://blogs.msdn.com/b/powershell/archive/2009/03/31/image-manipulation...

PowerShell kan derudover kan benytte pipelines til at sammenstykke funktionalitet.

MS har aldrig rigtigt forstået ideen med en gode shell med masser af nyttige tools.

Det er korrekt at de ignorerede det i langt tid. Jeg tror at du skal se PowerShell som indikation af hvad der sker nu. PowerShell er langt mere end en shell til kommandolinie administration af systemer. Det er en automatiseringsmodel, hvor der er langt højere grad af genanvendelighed mellem GUI kode og script snitflade.

  • 4
  • 0
Janus Sandsgaard

Ellers er der Corels "AfterShot", som også kører på Linux (og Mac og Win).
Her forenes RAW-fremkalder og omfattende katalog funktion ("hvilke fotos har jeg tagget med 'ostepops' og markeret som gul/ikke-færdige? Eller: "Vis mig alle fotos taget med min 18-200 mm").

Corel købte det som "Bibble", som i sin tid var min foretrukne inden for genren.
Desværre gik udviklingen i stå i en del tid, men ser nu ud til at være tilbage på sporet:
http://www.corel.com/corel/pages/index.jsp?pgid=12800164&storeKey=us&lan...

Som RAW-fremkalder virker AfterShot længere fremme end DarkTable, men er ej hverken free eller free. Lightroom udvikler sig løbende med masser af presets etc.

  • 3
  • 0
Hans Henrik Jakobsen

MS har stadig ikke forstået det endnu.

Det at bruge objekt modeller og komponenter hvor brugeren skal være særdeles skrap til programmering mener jeg er en kæmpe fejl fra MS side.

Det er også svært at teste den enkelte komponents funktionalitet for at finde ud af hvordan den skal bruges.

eks. "exiftool --help" giver hjælp til at komme i gang med komponenten. "info exiftool" giver en tilbunds beskrivelse af mulighederne med exiftool. Og Internet er fuld af gode eksempler.

Det er meget få komponenter som kommer med hjælp på Windows og der slet ikke et simpelt interface til at få hjælp som gælder for alle komponenter.

Mange komponenter har man slet ikke lov til at bruge uden specielle licens rettigheder, men du kan ikke finde ud af det på en let og overskuelig måde. Hermed mener jeg indkøbt software som man ikke har udvikler licens til. Inden man får set sig om, har lavet ulovlig software. (Har selv været lige ved at falde i fælden med noget EMC software).

Powershell ligner heller ikke noget andet, så det er ikke nemt at flytte mellem systemer.

Så for at bruge Powershell skal man faktisk være udvikler på platformen (man benytter jo et interface som er til at udvikle software med).

Jo, mere jeg tænker over det jo mere finder jeg, at MS har jogget i spinaten endnu en gang.

De kan bare ikke finde ud af, at lave software som er nem at bruge.

Beklager mine stavefejl, nogle gange bliver jeg for ivrig og glemmer stavekontrollen ;)

  • 2
  • 4
Peter Brodersen

Når det eneste værktøj man kender er en hammer så ligner alt et søm... det gælder også for regneark og især Excel.

Heh, regulære udtryk passer vist netop på den vending. Eller for at tage Jamie Zawinski-citatet:

Some people, when confronted with a problem, think
“I know, I'll use regular expressions.” Now they have two problems.

Det, som ofte er problemet, er at man tilgår marginalt struktureret data (som fx her i noget, som blot ligner en almindelig key-value-struktur i to kolonner) på en ikke-struktureret måde. Fx lige at tjekke for ekstra mellemrum efter "Lens ID". Eller at bortfiltrere linjer ud fra en bestemt værdi - og så krydse fingre for, at indholdet af denne værdi ikke også optræder som nøgle et sted. Eller for den sags skyld cut-delen på "m", som også efterlader et trailing space (hvilket måske eller måske ikke er et problem). Eller at globbe efter *, hvilket så giver problemer, hvis man har filer, som begynder med "-" (og exiftool lader ikke til at acceptere -- som mange andre GNU-værktøjer).

Det er netop et hit, at man hurtigt kan få et resultat ud af diverse tekstuelt output. Men nogle gange ender man blot med at grave sig dybere og dybere ned, fordi der hele tiden lige er en ekstra omstændighed, man skal tage højde for, fordi man tilgår (nogenlunde) struktureret data på en alternativ måde.

  • 1
  • 0
Christian P. Broe Petersen
  • 0
  • 1
Martin Regner Larsen

Men hvis du har noget ordentlig dokumentation til det, så vil jeg tage imod det med kyshånd.

Det er jo forskelligt hvordan man lærer. Der findes en ganske udmærket bog, der hedder "Learn Windows PowerShell in a Month of Lunches". Forfatteren har også lagt en stribe videoer på Youtube. PowerShell har også en ganske udmærket hjælp indbygget, men man får nok mest ud af hjælpen, hvis man har fået en mere indgående introduktion, f.eks. ved at se videoerne.

Jeg føler mig også mere hjemme i bash, men jeg kan ikke helt forklare hvorfor. PowerShell er både konsistent og kraftfuldt, så det er nok primært tilvænning.

  • 1
  • 0
Uffe Seerup

Jeg synes overhovedet ikke at Powershell giver mening, og jeg arbejder 95% på windows. Men hvis du har noget ordentlig dokumentation til det, så vil jeg tage imod det med kyshånd.

En god artikel og dokumentation til at komme i gang og forstå PowerShell er: https://technet.microsoft.com/en-us/library/hh857337.aspx

Dokumentationen er i øvrigt indbygget. For at være sikker på at du har opdateret dokumentation kan du eventuelt udføre kommandoen update-help i et PowerShell prompt. Sørg for at gøre dette i en PowerShell som er åbnet med admin rettigheder da der skal downloades og gemmes filer udenfor din bruger.

Hvis du ikke gider læse artikler, er der ganske få cmdlets du skal kende for at kunne komme i gang:
Get-Help er den cmdlet som giver dig adgang til dokumentationen. Du kan også benytte et af alias'erne help eller man.

Generel dokumentation er samlet i "about" beskrivelser. Hvis du skriver help about får du en liste over alle "about" emnerne. Du kan skrive help <emne> og få dokumentationen.

Dokumentation til de enkelte kommandoer hentes med man <kommando>. Der er generel meget udførlig dokumentation til cmdlets, inklusive eksempler. Skriv fx. man ps -det" for at få detaljeret dokumentation (inklusive eksempler) for *Get-Process cmdlet'en (alias ps). Skriv evt man man for at se hvordan bruger man (Get-Help) cmdlet.

Jeg kan anbefale: about_Command_Syntax og about_Parsing hvis du er usikker på reglerne for at kalde kommandoer.

Ellers er følgende gode start cmdlets: Get-Command, Get-Member, Get-Alias. De har iøvrigt standard alias'er gcm, gm og alias.

Get-Command lister alle tilgængelige kommandoer. Du kan skrive man Get-Command (eller blot man gcm) og få hjælp til hvordan du yderligere kan filtrere i listen.

Get-Alias (eller blot den korte form alias). Dette lister de alias'er der er defineret. Alle (!) powershell cmdlets følger en såkaldt Verb-Noun konvention hvor verbet fortæller handlingen (der er ca 50 "godkendte" verber) og substantiv delen fortæller hvad type objekter handlingen udføres på. Get-ChildItem henter fx "børn" til et givet objekt. Det er fx. underfoldere eller filer i en folder (derfor er Get-ChildItem også alias'et til dir og ls).

happy hunting...

  • 1
  • 0
Log ind eller Opret konto for at kommentere
IT Company Rank
maximize minimize