Problemstellung
Ich Photographiere nebenbei mit einer Spiegelreflex und lasse mir dabei immer JPG’s in einer überschaubaren Qualli, aber auch die RAW’s auf die Karte schreiben. Das hat den Vorteil, dass ich schon mal schnell die ersten Bilder rausgeben kann, aber für hochauflösende, nachbearbeitete Bilder noch das RAW habe. Allerdings kommt nun auch der große Nachteil: Bei mal schnell einigen hundert Bildern muss ich diese auch aussortieren. Dabei lösche ich die JPG’s raus, die ich nicht brauche (meist zwei bis drei loops, bis ich dann nur noch die wenigen schönen Bilder habe) und gehe dann nochmal durch und lösche die entsprechenden RAW’s. Der zweite Schritt kostet Zeit und ist manuell auch fehleranfällig.
Problemlösung
Das das nicht sein muss, zeige ich nun hier: Es soll ein einfaches Script werden, welchem man n Ordner übergeben kann, in denen dann:
- Wechsel in den Unterordner
- Ein „alt“-Ordner angelegt wird, wenn nicht schon vorhanden
- Für jeden RAW-File ein JPG gesucht wird
- Jedes RAW, was kein gleichnamiges JPG wird in den „alt“-Ordner verschoben
- Das ganze auch nochmal Rückwärts: Alle JPG’s ohne RAW (wurde vlt. aus versehen gelöscht) sollen aufgelistet werden
Also Step by Step: Zuerstmal die Übergabe von Parametern innerhalb des Aufrufes mit einem Loop über alle übergebenen Ordner. Beim Aufruf wird dabei mit bash Scriptname Ordner1/ Ordner2/ … Ordnern/ alle zu bereinigenden Ordner übergeben. Wichtig! Bei dieser Lösung MUSS das „/“ den Pfad/Ordner abschließen!
# get all Argumented folder
cmds="$@"
# loop over all folder
for folder in $cmds
do
#... do here something
done
Als nächstes wird der Ordner erstellt, in dem die überschüssigen RAW’s wandern sollen. Auch kein Hexenwerk, nur etwas Hackelig durch den Ordnerpfad:
# create the backup folder it not exists, don't delete the files direct
echo "${folder}alt"
if [ ! -d "${folder}alt" ]; then
mkdir "${folder}alt"
printf " - create folder for moving Images\n"
fi
Dann sollen die RAW’s in dem Ordner durchgegangen werden, ob eine Datei mit gleichem Namen und *.JPG als auch *.jpg als Endung existiert (kann je nach Hintergrund auch beides vorkommen:
# run over all files and move the *.CR2 witch has no jpg pendent
printf " - sort RAW-Files\n"
count=0
for file in ${folder}*.CR2;
do
# keep it a bit shorter
bname="$(basename -s .CR2 $file)"
if [ ! -f "${folder}$bname.JPG" ] && [ ! -f "${folder}$bname.jpg" ] ; then
printf " -- move %s\n" $file
mv $file ${folder}alt/$(basename $file)
count=$((count+1))
fi
done
# give a result
printf "\n - result : moved Images %1d\n\n" $count
Dann noch der Loop umgekehrt. Dabei soll einmal auf „Herrenlose JPG’s“ geprüft werden. Das kann ggf. nochmal frühzeitig :
# check if for each jpg also a RAW exists
count=0
for file in ${folder}*.JPG ${folder}*.jpg;
do
# keep it a bit shorter
bname="$(basename -s .jpg $(basename -s .JPG $file))"
if [ ! -f "${folder}$bname.CR2" ] ; then
printf " -- no Raw-File for %s \n" $file
count=$((count+1))
fi
done
# give a result
printf "\n - result : JPGs without RAWs %1d\n\n" $count
Und mit ein bisschen drum herum sieht das dann zusammengebaut so aus:
#!/bin/bash
# get all Argumented folder
cmds="$@"
# loop over all folder
for folder in $cmds
do
# go to the subfolder
#cd $folder
printf "#### run sorting in %s ####\n" $folder
# create the backup folder it not exists, don't delete the files direct
echo "${folder}alt"
if [ ! -d "${folder}alt" ]; then
mkdir "${folder}alt"
printf " - create folder for moving Images\n"
fi
# run over all files and move the *.CR2 witch has no jpg pendent
printf " - sort RAW-Files\n"
count=0
for file in ${folder}*.CR2;
do
# keep it a bit shorter
bname="$(basename -s .CR2 $file)"
if [ ! -f "${folder}$bname.JPG" ] && [ ! -f "${folder}$bname.jpg" ] ; then
printf " -- move %s\n" $file
mv $file ${folder}alt/$(basename $file)
count=$((count+1))
fi
done
# give a result
printf "\n - result : moved Images %1d\n\n" $count
# check if for each jpg also a RAW exists
count=0
for file in ${folder}*.JPG ${folder}*.jpg;
do
# keep it a bit shorter
bname="$(basename -s .jpg $(basename -s .JPG $file))"
if [ ! -f "${folder}$bname.CR2" ] ; then
printf " -- no Raw-File for %s \n" $file
count=$((count+1))
fi
done
# give a result
printf "\n - result : JPGs without RAWs %1d\n\n" $count
done
echo "\e[0;32msorting done! \e[0m"
Was kann man nun noch verbessern? Aktuell muss noch mühsam jeder einzelne Ordner angegeben werden, der durchsucht/bereinigt werden soll. Das könnte natürlich auch einfacher umgesetzt werden. Da ich allerdings nur selten mehr als ein paar Ordner bereinige, ist das für mich keine notwendige Option.
Zudem sind ist aktuell nur die eine RAW-File-Endung und auch nur Uppercase abgebildet, auch das könnte noch erweitert werden auf div. verfügbare und auch Lowercase. Auch dies aktuell für mich keine nötigen Optionen und daher nicht umgesetzt.