Kick not used RAW-Files

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert