Sortering af Billeder

Vi har alt for mange billeder, specielt fordi vi har flere kopier på flere computere. I gamle dage havde jeg et avanceret shell-script baseret på sha1sum og jhead til at installere og rydde op i billed-junglen, men det er som så meget andet blevet udsat for bit-rot.  Det der er sket er, at jeg har fået nye billed-filer som ikke har de felter jeg lagde til grund da jeg skrev scriptet for snart mange år siden.

Nu skulle jeg så til det igen og kiggede lige lidt rundt og fandt at jeg med to nye tools fdupes og exiftool kunne simplificere det ganske gevaldigt.  Først skal programmerne lige installere, det er ligetil under en Ubuntu/Debian

sudo apt install fdupes exiftool

Men da jeg jo ikke kan huske parametrene til programmerne har jeg skrevet et lille shellscript som klarer detaljerne:

#!/bin/bash
#set -x 
VERBOSE=-v
ARGS="-ext avi -ext jpg -ext pdf -ext mp4 -ext mov -ext png -ext tif ${VERBOSE}"

usage() {
        echo "usage: $(basename $0) src dest"
        echo " Remove files from src which exist in dest"
        echo " Move photos from src to dest sorted f.ex"
        echo " from: src/DCIM/113___04/IMG_0860.JPG"
        echo " to:   dest/2014/04/140420-091254.jpg"
        echo " unresolved pictures remains in src"
        echo $*
        exit 1
}

vecho() {
        if [ x$VERBOSE != x ]; then
                echo $* >/dev/stderr
        fi
}

src=$1
dst=$2

if [ x = x$src -o x = x$dst ]; then
        usage
fi
if [ -d $src ]; then
        src="-r $src"
elif [ ! -f $src ]; then
        usage src=$src not found
fi
if [ ! -d $dst ]; then
        usage dst=$dst not found
fi

vecho "remove duplicates from $src"
fdupes -d -r -N $dst $src

format="${dst}/%Y/%m/%y%m%d-%H%M%S%%-c.%%le"

vecho "# move photos with DateTimeOriginal into $format"
# canon sx280 has CreateDate wrong so we use the one below first
exiftool $ARGS '-FileName<DateTimeOriginal' -d ${format} ${src}

vecho "# move photos with CreateDate into $format"
exiftool $ARGS '-FileName<CreateDate' -d ${format} ${src}

vecho "# move the remaining photos into $format"
exiftool $ARGS '-FileName<FileModifyDate' -d ${format} ${src}

Script virker således:

  • Slet dubletter af filer der allerede findes i src (eller dst)
  • Flyt filer der har en DateTimeOrignal over i det nye filnavn baseret på indholdet af DateTimeOrignal feltet
  • Flyt filer der har en CreateDate over i det nye filnavn baseret på indholdet af CreateDate feltet
  • Resten flyttes over i et nyt filnavn baseret på hvornår filen sidst er ændret.
  • Der burde herefter ikke være flere billeder/videoer tilabe i src

Måden jeg bruger det på, er at jeg har to dirs

  • Pictures/Sorted
  • Pictures/Unsorted

Når som helst jeg har nogle billeder jeg vil have lagt in kopierer jeg hele baduljen in i Pictures/Unsorted, hvorefter jeg kører

photos2sorted Pictures/Unsorted Pictures/Sorted
find -type -f Pictures/Unsorted

På en god dag er Unsorted nu tom, ellers må man jo igang per håndkraft, og hvis det sker tit at den ikke klarer det så må man jo pille lidt i scriptet, så det klarer den nye type billedfiler der har sneget sig ind på din computer

Resultatet af dette er:

peter@envy:Pictures> du -sh Sorted/*
53M	Sorted/1970
35M	Sorted/2002
708M	Sorted/2003
1.9G	Sorted/2004
2.4G	Sorted/2005
1.4G	Sorted/2006
951M	Sorted/2007
2.0G	Sorted/2008
1.3G	Sorted/2009
1.9G	Sorted/2010
1.6G	Sorted/2011
1.7G	Sorted/2012
5.4G	Sorted/2013
11G	Sorted/2014
14G	Sorted/2015
9.0G	Sorted/2016
11G	Sorted/2017
658M	Sorted/2018
306M	Sorted/2036
peter@envy:Pictures> 

Som det ses er der to problemer 1970 og 2036, dem kunne jeg jo lige flytte rundt per håndkraft.

Problemet her er et Canon sx280 camera som har CreateDate forkert derfor har jeg rettet scriptet til så der prøves først med DateTimeOriginal.

Bare til sammenligning så er det nye script på godt 50 linier (der faktisk kun 4 relevante kommandoer).

Det gamle system var på knap 300 linier og det uden usage()

peter@envy:bin> wc cleanup_duplicates install_from_camera remove_empty_dirs 
  56  156  907 cleanup_duplicates
 216  777 5408 install_from_camera
  25   67  615 remove_empty_dirs
 297 1000 6930 total
peter@envy:bin> wc photos2sorted 
  51  169 1130 photos2sorted
peter@envy:bin> 

 

 

This entry was posted in Linux. Bookmark the permalink.