Wie lösche ich "unbenutzte" Rohdateien, die keine .jpg-Übereinstimmung haben?

Ich fotografiere RAW+JPG, nämlich NEF und JPG. Nachdem ich manchmal Hunderte von Bildern (mit einem einfachen Programm) angesehen und die JPGs gelöscht habe, habe ich viele unnötige NEF-Dateien übrig. Wenn es ein Skript zum Löschen verwaister NEF-Dateien im Verzeichnis gäbe, wäre das sehr hilfreich. Ich habe hier eine ähnliche Frage gelesen " Wie lösche ich JPG-Dateien, aber nur wenn die passende RAW-Datei existiert? " und die mit der Eingabeaufforderung vorgestellte Lösung funktioniert sehr gut. Ich habe mich gefragt, ob für meine missliche Lage eine verfügbar ist?

Kannst du diese Frage hier verlinken? Die Antwort darauf wird mit ziemlicher Sicherheit ein Shell-Skript sein - fragen Sie stattdessen vielleicht SuperUser, denn wenn Sie eine gute Definition dessen haben, was Sie löschen müssen (nach Dateinamen), ist dies eine ziemlich triviale Aufgabe.
Verwenden Sie für die Zukunft einfach Geeqie. Es löscht automatisch die passenden RAW-Dateien und alle anderen, die basierend auf der Konfiguration als 'Sidecar'-Datei definiert sind.
Ich habe mein Setup wie folgt: NEF: \\Photos\RAW\YYYY\YYYY-MM-DD\original.nef Jpegs: \\Photos\RAW\YYYY\YYYY-MM-DD\original.jpeg Jedenfalls kann ich das anwenden Skript dazu?
In Bash: orphan=.nef; parent=.jpeg; für f in *"$orphan"; do F="${f%$orphan}$parent"; wenn testen! -f "$F"; dann echo "Identifiziertes Waisenkind: $f existiert, aber nicht $F"; fi done Ich kann nicht glauben, wie lang und kompliziert diese anderen Antworten sind. Ja, ich weiß, als Kommentar antworten, aber es ist geschützt ...

Antworten (3)

Ich habe ein Skript in Python geschrieben , um die Arbeit für mich zu erledigen. Es heißt remove-orphaned-raw-images.pyund ich habe es auf Github veröffentlicht .

Grundsätzlich durchläuft es alle Dateien in einem bestimmten Ordner und verschiebt verwaiste Rohbilder (in meinem Fall *.CR2Dateien ohne passendes JPEG) in einen Sicherungsordner. Optional können Sie das Skript anweisen, die Dateien tatsächlich zu löschen.

Hier ist ein Überblick über den Algorithmus:

  • Rufen Sie eine Liste aller Dateien im ausgewählten Verzeichnis ab.
  • Sortieren Sie diese Dateien in RAW- und JPEG-Dateien (hängen Sie sie an separate Listen an).
  • Überprüfen Sie für jedes Element in der RAW-Bildliste, ob eine Übereinstimmung in der JPEG-Liste vorhanden ist;
    Wenn nicht, hängen Sie dieses Bild an eine Liste verwaister Rohbilder an.
  • Verschieben Sie die Bilder in der Liste der verwaisten Bilder in einen Sicherungsordner
    (oder löschen Sie sie direkt, wenn dies ausdrücklich gewünscht wird).

Das Tool erklärt Ihnen, wie Sie es verwenden, wenn es mit der Hilfeoption -hin der Befehlszeile ausgeführt wird.

Dieses Problem ist auch bei mir aufgetreten, weshalb ich dieses Tool geschrieben habe. Ich verwende meine DSLR, um JPEG- oder RAW+JPEG-Bilder aufzunehmen, niemals nur RAW. Beim Aussortieren verschwommener oder anderweitig schlechter Aufnahmen verwende ich die JPEGs, um sie schnell anzusehen und die schlechten zu löschen. Dadurch bleiben mir RAW-Bilder übrig, von denen ich die passenden JPEGs (aus einem bestimmten Grund) gelöscht habe.

Mit der Frage, die Sie erwähnt haben, habe ich Ihnen ein Skript geschrieben

okay warnung! Seien Sie vorsichtig mit diesem Skript! - MACH EIN BACKUP

1) Erstellen Sie eine bat-Datei namens clean.bat und legen Sie sie in das Verzeichnis, mit dem Sie arbeiten möchten

2) Geben Sie dann Folgendes in die bat-Datei ein

mkdir keep
for /f "delims==" %%r in ('dir /b *.jpg') do move "%%~dpr%%~nr.nef" "%CD%\keep\" 2> nul
move *.jpg "%CD%\keep\"
del *.nef
del *.jpg
move "%CD%\keep\*.*" "%CD%\"
rmdir keep

3) Öffnen Sie die Eingabeaufforderung als Administrator und navigieren Sie zum Ordner mit der clean.bat 4) Führen Sie clean.bat aus

Grundsätzlich ist der Fluss des Skripts

  • Erstellen Sie ein Verzeichnis namens Keep
  • Verschieben Sie alle übereinstimmenden NEF-Dateien in den Keep-Ordner
  • Verschieben Sie alle JPEGs in den Keep-Ordner
  • Löschen Sie dann alle Dateien aus dem Quellordner
  • Verschieben Sie die Keep-Dateien zurück
  • Entfernen Sie den Keep-Ordner

Bitte, BITTE testen Sie das aus!

UPDATE: Skriptänderung vorgenommen, um mit Ordnern zu arbeiten, die Leerzeichen enthalten

+1 für eine unkomplizierte One-Shot-Lösung! Ich brauche diese Lösung schon lange. Früher habe ich Befehle ausgearbeitet, indem ich die DIR-Ausgabe in Excel eingefügt und komplizierte Operatoren wie vlookup verwendet habe, um einzelne Befehle zu generieren, aber das deckt fast alle meine Bedürfnisse ab. Getestet das Skript und es ist völlig in Ordnung für mich. Musste mehrere Referenzen konsultieren, um das Skript vollständig zu verstehen und es für andere ähnliche Operationen ändern zu können.
Fantastisch, Sie haben mir Stunden mühsamer Arbeit erspart!!! Ich habe es mehrmals versucht und es funktioniert zu schnell. Es ist genau das, wonach ich gesucht habe.
@al-h - kannst du dann bitte als richtig ankreuzen? Danke
Rob Ich bin mir nicht sicher, was du mit "bitte als richtig ankreuzen" meinst. Ich sehe nirgendwo, wo ich einen korrekten Link überprüfen kann.
Eines ist mir aufgefallen. Dies funktioniert nicht bei Ordnern auf dem Desktop (löscht alle jpg- und NEF-Dateien), also zuerst testen. Ich verwende Windows XP Pro.
@al-h Neben meiner Antwort befindet sich ein ausgegrautes Kontrollkästchen. - nicht sicher, warum dies auf dem Desktop nicht funktionieren würde, funktioniert es überall sonst? - Das tut mir leid
Skript geändert, um Leerzeichen im Ordnernamen zu berücksichtigen.
Ich schätze, ich habe die Idee für mein nächstes Feature in meinem Bildbetrachter: "[x] Link jpg and raw [x] View the jpg [ ] view the raw".

Hier ist mein Python-Skript zum Löschen von cr2-Dateien ohne JPEG.

Es sucht rekursiv innerhalb des aktuellen Verzeichnisses ".". Es berücksichtigt alle Bilder in allen Ordnern.

import os 
import sys

#Searches through the current directory, recursively, looking for any raw
#and jpeg files. It enumerates the jpegs it finds, without the extension, and
#then enumerates the raw files it finds. If it finds a raw file for which no
#jpeg exists, then it deletes the raw file.
#
# This WILL NOT WORK, if there are files with repeated file numbers.
# this will NOT be an issue if there's only one camera. 

# A dict of filename: (rawpath, jpegpath)
files_seen = {}

for (cur_dir, subdirs, files) in os.walk("."):
  for file in files:
    fname, fext = os.path.splitext(file)
    fext = fext.lower()



    if (fext == ".jpg"):
      content = files_seen.setdefault(fname, [None, None])
      # if it is then filenames have du'ped
      assert(content[1] is None)
      content[1] = os.path.join(cur_dir, file)

    elif (fext == ".cr2"):
      content = files_seen.setdefault(fname, [None, None])
      assert(content[0] is None)
      content[0] = os.path.join(cur_dir, file)

#at the end, we look for raw files without a jpeg,

for key in files_seen:
  (raw_path, jpeg_path) = files_seen[key]

  if jpeg_path is None:
    print("Deleting: %s" % raw_path)
    #os.system("pause.exe")    
    os.unlink(raw_path)

print("Done")
os.system("pause.exe")
Benennen Sie einfach ".cr2" in ".nef" um
Ich bin mit Python nicht vertraut, aber ich sehe, dass es sich in der letzten Zeile auf "pause.exe" bezieht. Bedeutet das, dass es nur unter Windows funktioniert? Ich dachte, dass Python plattformunabhängig war.
Tag auch. Die pause.exe habe ich nur eingefügt, damit das Python-Dingo nicht verschwindet, sobald es fertig ausgeführt wurde, nachdem ich im Explorer darauf doppelgeklickt habe. Es steht Ihnen frei, diese Zeile zu entfernen und voila, es wird plattformunabhängig sein. Die Verwendung von betriebssystemabhängigem Zeug ist eine schlechte Übung, und da ich es ursprünglich für mich geschrieben habe, war ich faul :D Zumindest habe ich keine Pfade mit naiven Schrägstrichen verkettet oder betriebssystemspezifische Funktionen zum Löschen von Dateien verwendet.
Es ist auch für Python 3.x-Versionen geschrieben. Wenn Sie möchten, dass es 2.x-freundlich ist, ändern Sie einfach alle print ("something"), um "something" zu drucken.