photoc: Command-line tools voor fotografen

Met deze tool kun je een shoot samenvatten, metadata lezen, onscherpe foto's en exacte duplicaten vinden, foto's hernoemen en sorteren in mappen, contactvellen en kleinere kopieën maken, of GPS-locaties verwijderen voordat je bestanden deelt. Elk commando werkt in shell-scripts en de meeste kunnen output in JSON-formaat genereren.

photoc werkt met JPEG-bestanden en leest metadata uit Sony ARW RAW-bestanden. Andere RAW-formaten (zoals CR3, NEF, RAF, DNG, ...) en HEIC worden momenteel niet ondersteund. Zie de sectie 'Bestandstype-ondersteuning' voor meer details.

photoc wijzigt nooit je originele bestanden, tenzij je hier specifiek om vraagt met --apply (voor hernoemen en sorteren) of --in-place (voor scrubben). Bestaande bestanden worden nooit overschreven.

Alleen-lezen-commando's lezen enkel data. Commando's die bestanden aanmaken, schrijven nieuwe kopieën naast je originelen of in een door jou gekozen map. Zie 'Bestandsveiligheid' voor details.

photoc is geen RAW-ontwikkelaar, beeldbewerker, fotocatalogus of vervanging voor uitgebreide metadata-editors zoals ExifTool. Windows wordt momenteel niet ondersteund.

Snelstart

Installeer photoc via de Homebrew tap (macOS of Linux met Homebrew):

brew install ahmetomerv/photoc/photoc
photoc --version

De volledige naam voegt de tap automatisch toe; Homebrew installeert de vereiste bibliotheken. Gebruik in plaats daarvan de shell-installer voor een vooraf gebouwd uitvoerbaar bestand.

Probeer vervolgens deze alleen-lezen-commando's op je eigen foto's:

photoc --help                         # lijst met commando's
photoc exif foto.jpg                 # metadata van één foto
photoc stats ./photos --recursive     # samenvatting van een map en submappen
photoc timeline ./photos              # review van een shoot per sessie

Een voorbeeld van hernoemen: photoc rename ./shoot --format '{date}{camera}{sequence}.{ext}' geeft een voorbeeld van drie JPEG's zonder bestanden te wijzigen:

session_1000.jpg -> 2026-09-27_Model S_0001.jpg
session_1030.jpg -> 2026-09-27_Model S_0002.jpg
session_1200.jpg -> 2026-09-27_Model S_0003.jpg

Summary: 3 JPEG, 3 planned, 0 unchanged, 0 blocked, 0 applied, 0 rolled back

Voor hulp bij een specifiek commando, voer photoc <commando> --help of man photoc uit.

Map-scans kijken alleen in de gekozen map, tenzij je --recursive toevoegt, en ze volgen geen symlinks. Zet paden die spaties bevatten tussen aanhalingstekens, zoals photoc exif "Summer trip/foto.jpg". Plaats opties vóór de -- wanneer een pad begint met een koppelteken, bijvoorbeeld photoc exif -- -foto.jpg.

Commando's

Inspecteren (alleen-lezen)

CommandoDoel
exifToont afmetingen, camera, belichting, opnametijd en GPS van één foto
statsVat opslag, opnamedata, camera's, lenzen en belichtingsinstellingen samen
timelineGroepeert een shoot per datum en sessie
queryZoekt foto's die voldoen aan metadata-filters zoals ISO, dia, camera of datum
duplicatesZoekt byte-identieke bestanden en toont potentiële ruimtebesparing
focusRangschikt JPEG's op scherpte-score (laagste eerst) om te helpen bij het selecteren
checkControleert JPEG's op structurele problemen en decoderingsfouten

Organiseren (standaard voorbeeld; voeg --apply toe om bestanden te wijzigen)

CommandoDoel
renameHernoemt foto's met metadata-sjablonen zoals {date}{camera}{sequence}.{ext}
sortVerplaatst foto's naar JJJJ/MM/DD/ of session-001/ mappen

Kopieën maken (originelen blijven standaard ongewijzigd)

CommandoDoel
compressMaakt kleinere JPEG-kopieën met een gekozen kwaliteit of doelfilmgrootte
contactMaakt JPEG-contactvellen met bestandsnamen en optionele belichtingsgegevens
scrubMaakt kopieën zonder GPS, private velden of beschrijvende metadata

--json werkt met exif, stats, timeline, query, duplicates, focus en check. Langere map-operaties tonen voortgang op stderr; gebruik --no-progress om dit uit te schakelen.

Bestandstype-ondersteuning

CommandoJPEGSony ARWAndere RAW-bestanden
exif, stats, timeline, rename, sortMetadataAlgemene TIFF/EXIF metadataNiet ondersteund/overgeslagen
query, check, compress, contact, focus, scrubOndersteundNiet ondersteund/overgeslagenNiet ondersteund/overgeslagen
duplicatesExacte bytesExacte bytesExacte bytes

ARW-ondersteuning is beperkt tot metadata: geen RAW-ontwikkeling, pixeldecodering, compressie of GPS-herschrijving. Bestanden worden herkend op extensie (.jpg, .jpeg, .arw, hoofdletterongevoelig).

Workflows

Deze recepten combineren commando's zoals je ze zou gebruiken na een shoot. Commando's die bestanden wijzigen, worden in twee stappen getoond: voorbeeld, daarna toepassen.

Na een shoot: reviewen, hernoemen en sorteren

# Bekijk hoe de dag is opgedeeld in sessies. Pas --gap aan aan je manier van fotograferen.
photoc timeline ./shoot --gap 45m

# Voorbeeld van nieuwe namen, en pas daarna hetzelfde commando toe.
photoc rename ./shoot --format '{date}_{camera}_{sequence}.{ext}'
photoc rename ./shoot --format '{date}_{camera}_{sequence}.{ext}' --apply

# Voorbeeld van sessiemappen, en pas daarna toe.
photoc sort ./shoot --by session --gap 45m
photoc sort ./shoot --by session --gap 45m --apply

Als een foto de metadata mist die nodig is voor een plan (zoals een opnamedatum), wordt het hele plan geblokkeerd en verandert er niets. Het voorbeeld somt de geblokkeerde bestanden op.

Culling: onscherpe foto's en duplicaten vinden

# Laagste scherpte-scores eerst; toon alleen die onder de drempelwaarde.
photoc focus ./shoot --recursive --threshold 100 --only-blurry

# Byte-identieke kopieën, bijvoorbeeld door een kaart twee keer te importeren.
photoc duplicates ./shoot --recursive

Scherpte-scores zijn een hulpmiddel voor review, geen definitief oordeel: detail in het onderwerp, ruis en bewuste onscherpte beïnvloeden de score. photoc verwijdert nooit bestanden; jij beslist wat er weg moet.

Voor het delen: kleinere kopieën zonder locatie

# Maak gecomprimeerde kopieën in ./share, behoud de originelen.
photoc compress ./selects --recursive --target 2MB --output-dir ./share

# Verwijder locatie en identificerende metadata uit die kopieën.
photoc scrub ./share --privacy --recursive --in-place

# Bevestig dat geen enkele kopie nog GPS heeft (print niets als alles schoon is).
photoc query ./share --recursive --has-gps

compress behoudt standaard EXIF, inclusief GPS, dus gebruik scrub na het comprimeren. --in-place wordt hier alleen gebruikt omdat ./share kopieën bevat; het vervangt bestanden zonder back-up. --privacy kan data achterlaten in ondoorzichtige MakerNotes.

Specifieke foto's vinden

photoc query ./photos --recursive --iso ">800" --aperture "<=4"
photoc query ./photos --camera "DSC-RX100M7A"
photoc query ./photos --after 2026-01-01 --before 2026-12-31

Filters worden gecombineerd met AND, en datumgrenzen zijn inclusief de genoemde dagen.

Bestandsveiligheid

CommandoWijzigt originelen?OutputBestaande bestanden
Inspectie-commando'sNooitRapport op stdoutNiet aangeraakt
rename, sortAlleen met --applyHernaamd of verplaatstNooit overschreven; plan wordt eerst gecontroleerd
compressNooitfoto.compressed.jpg kopieënOvergeslagen (map) of geweigerd (single file)
contactNooitsheet.jpg, sheet-001.jpg, ...Nooit overschreven
scrubAlleen met --in-placefoto.scrubbed.jpg kopieënGeweigerd

Belangrijke details:

  • Hernoemen en sorteren controleren het hele plan voordat er iets wordt gewijzigd. Als een hernoeming of verplaatsing mislukt, probeert photoc eerdere wijzigingen ongedaan te maken, maar een ander proces dat tegelijkertijd bestanden wijzigt, kan volledig herstel voorkomen. Houd back-ups van belangrijke collecties.
  • Compressie verliest beelddetail en kan een groter bestand produceren. EXIF (inclusief oriëntatie en GPS), ICC-kleurprofielen en XMP worden behouden; andere APP-markers worden niet gekopieerd. Als een --target grootte niet kan worden bereikt, schrijft photoc nog steeds een kopie met de minimale kwaliteit en stopt met status 1. 2MB betekent 2.000.000 bytes; 2MiB betekent 2.097.152 bytes.
  • Scrubbing kopieert JPEG-beelddata zonder recompressie. --gps verwijdert alleen EXIF GPS; --privacy verwijdert ondersteunde locatie- en identificatievelden; --all-metadata verwijdert beschrijvende metadata maar behoudt ICC-profielen en oriëntatie. Informatie in ondoorzichtige MakerNotes of onbekende formaten kan blijven bestaan. scrub --in-place maakt geen back-up. Het verifieert een tijdelijke kopie en vervangt daarna het origineel in één atomaire stap. Symlinks, hard links en bestanden die tijdens het proces wijzigen, worden geweigerd. Rechtenbits en groepseigendom worden behouden; ACL's en uitgebreide attributen worden niet gekopieerd.
  • Check leest zonder iets te wijzigen. Een "OK"-resultaat is geen back-up of garantie voor visuele kwaliteit.

Scripting

Resultaten gaan naar stdout; statusinformatie, waarschuwingen, fouten en voortgang gaan naar stderr. --json output bevat alleen JSON, en ontbrekende waarden zijn null.

photoc exif foto.jpg --json | jq '.exposure'
photoc timeline ./photos --json | jq '.summary'
photoc query ./photos --recursive --has-gps --print0 | xargs -0 ls -l

Exit codes

CodeBetekenis
0Succes
1Een bewerking of bestandssysteem-operatie is mislukt, of een compressiedoel is niet gehaald
2Ongeldig gebruik van het commando

Globale opties werken vóór of ná het commando: -q/--quiet behoudt resultaten maar verbergt statusinformatie en niet-kritieke waarschuwingen; -v/--verbose voegt diagnostiek toe aan stderr; en --no-progress schakelt de voortgangsweergave uit.

Installatie

Homebrew (aanbevolen)

De snelstart gebruikt de Homebrew tap van het project. Dit bouwt photoc uit broncode en beheert afhankelijkheden. Update een bestaande installatie met:

brew update
brew upgrade photoc
photoc --version

Shell-installer

De shell-installer downloadt een checksum-geverifieerde release voor macOS arm64, macOS x8664 of Linux x8664 naar $HOME/.local/bin.

Installeer eerst de runtime-bibliotheken voor je systeem:

macOS:

brew install libexif jpeg-turbo libxml2

Ubuntu / Debian:

sudo apt install libexif12 libturbojpeg libjpeg8 libxml2

Download en voer vervolgens de installer uit:

curl -fsSL https://raw.githubusercontent.com/ahmetomerv/photoc/main/scripts/install.sh -o install-photoc.sh
sh install-photoc.sh
photoc --version

Release-binaries vereisen macOS 15 of later, of glibc-gebaseerde Linux met glibc 2.35 of later. De installer verifieert de SHA-256 checksum en vervangt nooit een bestaand bestand.

Opties voor versie of directory:

sh install-photoc.sh --version vX.Y.Z --install-dir "$HOME/bin"

Verwijderen:

curl -fsSL https://raw.githubusercontent.com/ahmetomerv/photoc/main/scripts/uninstall.sh -o uninstall-photoc.sh
sh uninstall-photoc.sh          # voorbeeld
sh uninstall-photoc.sh --apply  # verwijderen

Probleemoplossing

photoc: command not found Controleer of je installatiemap in je PATH staat.

Welke photoc-installatie gebruik ik? Voer type -a photoc uit om alle overeenkomende commando's te zien en command -v photoc om te zien welke de shell selecteert.

error while loading shared libraries: libturbojpeg.so.0 (Linux) of dyld: Library not loaded (macOS) Er ontbreekt een runtime-bibliotheek. Installeer de pakketten die worden genoemd onder de sectie 'Shell-installer'.

macOS zegt dat het binary "cannot be opened" of "cannot be verified" Release-binaries zijn niet ondertekend of genotariseerd. Als je een binary via een browser hebt gedownload, verwijder dan de quarantine-flag na het verifiëren van de checksum: xattr -d com.apple.quarantine ./photoc-darwin-arm64

Mijn foto's worden overgeslagen of als 'unsupported' gerapporteerd photoc leest alleen JPEG-bestanden en Sony ARW-metadata, herkend aan de extensie.

Hernoemen of sorteren zegt dat het plan geblokkeerd is Minstens één foto mist metadata die nodig is voor het plan, zoals een opnamedatum. Het voorbeeld noemt elk geblokkeerd bestand. Verplaats deze bestanden of kies een sjabloon dat het missende veld niet nodig heeft.

Een scan is geslaagd, maar sommige bestanden hadden waarschuwingen stats en timeline gaan door bij individuele bestandfouten en tellen deze mee in de samenvatting.

Bijdragen

Bugrapporten, documentatie-aanpassingen en gerichte code-wijzigingen zijn welkom. Fotografen kunnen ook helpen door sample-bestanden van andere camera's te delen, zodat ondersteuning voor meer formaten getest kan worden.

Licentie

De broncode van photoc is gelicenseerd onder de MIT-licentie. Afhankelijkheden behouden hun eigen licenties. Deze software is gedeeltelijk gebaseerd op het werk van de Independent JPEG Group.