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)
| Commando | Doel |
|---|---|
exif | Toont afmetingen, camera, belichting, opnametijd en GPS van één foto |
stats | Vat opslag, opnamedata, camera's, lenzen en belichtingsinstellingen samen |
timeline | Groepeert een shoot per datum en sessie |
query | Zoekt foto's die voldoen aan metadata-filters zoals ISO, dia, camera of datum |
duplicates | Zoekt byte-identieke bestanden en toont potentiële ruimtebesparing |
focus | Rangschikt JPEG's op scherpte-score (laagste eerst) om te helpen bij het selecteren |
check | Controleert JPEG's op structurele problemen en decoderingsfouten |
Organiseren (standaard voorbeeld; voeg --apply toe om bestanden te wijzigen)
| Commando | Doel |
|---|---|
rename | Hernoemt foto's met metadata-sjablonen zoals {date}{camera}{sequence}.{ext} |
sort | Verplaatst foto's naar JJJJ/MM/DD/ of session-001/ mappen |
Kopieën maken (originelen blijven standaard ongewijzigd)
| Commando | Doel |
|---|---|
compress | Maakt kleinere JPEG-kopieën met een gekozen kwaliteit of doelfilmgrootte |
contact | Maakt JPEG-contactvellen met bestandsnamen en optionele belichtingsgegevens |
scrub | Maakt 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
| Commando | JPEG | Sony ARW | Andere RAW-bestanden |
|---|---|---|---|
exif, stats, timeline, rename, sort | Metadata | Algemene TIFF/EXIF metadata | Niet ondersteund/overgeslagen |
query, check, compress, contact, focus, scrub | Ondersteund | Niet ondersteund/overgeslagen | Niet ondersteund/overgeslagen |
duplicates | Exacte bytes | Exacte bytes | Exacte 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
| Commando | Wijzigt originelen? | Output | Bestaande bestanden |
|---|---|---|---|
| Inspectie-commando's | Nooit | Rapport op stdout | Niet aangeraakt |
rename, sort | Alleen met --apply | Hernaamd of verplaatst | Nooit overschreven; plan wordt eerst gecontroleerd |
compress | Nooit | foto.compressed.jpg kopieën | Overgeslagen (map) of geweigerd (single file) |
contact | Nooit | sheet.jpg, sheet-001.jpg, ... | Nooit overschreven |
scrub | Alleen met --in-place | foto.scrubbed.jpg kopieën | Geweigerd |
Belangrijke details:
- Hernoemen en sorteren controleren het hele plan voordat er iets wordt gewijzigd. Als een hernoeming of verplaatsing mislukt, probeert
photoceerdere 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
--targetgrootte niet kan worden bereikt, schrijftphotocnog steeds een kopie met de minimale kwaliteit en stopt met status 1.2MBbetekent 2.000.000 bytes;2MiBbetekent 2.097.152 bytes. - Scrubbing kopieert JPEG-beelddata zonder recompressie.
--gpsverwijdert alleen EXIF GPS;--privacyverwijdert ondersteunde locatie- en identificatievelden;--all-metadataverwijdert beschrijvende metadata maar behoudt ICC-profielen en oriëntatie. Informatie in ondoorzichtige MakerNotes of onbekende formaten kan blijven bestaan.scrub --in-placemaakt 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
| Code | Betekenis |
|---|---|
| 0 | Succes |
| 1 | Een bewerking of bestandssysteem-operatie is mislukt, of een compressiedoel is niet gehaald |
| 2 | Ongeldig 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.
Groetjes,