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>