Wie lösche ich "nicht verwendete" Rohdateien, die keine JPG-Übereinstimmung haben?

10

Ich fotografiere RAW + JPG, nämlich NEF und JPG. Nachdem ich manchmal Hunderte von Bildern (mit einem einfachen Programm) angezeigt 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 dies sehr hilfreich. Ich habe hier eine ähnliche Frage gelesen: " Wie lösche ich JPG-Dateien, aber nur, wenn die passende RAW-Datei vorhanden ist? ", Und die mit der Eingabeaufforderung präsentierte Lösung funktioniert sehr gut. Ich habe mich gefragt, ob einer für meine missliche Lage verfügbar ist.

Al H.
quelle
Können Sie hier einen Link zu dieser Frage bereitstellen? Die Antwort darauf wird mit ziemlicher Sicherheit ein Shell-Skript sein - fragen Sie vielleicht stattdessen bei SuperUser nach, denn wenn Sie eine gute Definition dessen haben, was Sie löschen müssen (nach Dateiname), ist dies eine ziemlich triviale Aufgabe.
Ben Parsons
1
Verwenden Sie für die Zukunft einfach Geeqie. Es löscht automatisch die passenden RAW-Dateien und alle anderen Dateien, die basierend auf der Konfiguration als Sidecar-Datei definiert sind.
Itai
Ich habe mein Setup wie folgt: NEF: \\ Fotos \ RAW \ JJJJ \ JJJJ-MM-TT \ original.nef JPEGs: \\ Fotos \ RAW \ JJJJ \ JJJJ-MM-TT \ original.jpeg Wie auch immer, ich kann dies anwenden Skript dazu?
In Bash: Orphan = .nef; parent = .jpeg; für f in * "$ orphan"; do F = "$ {f% $ orphan} $ parent"; wenn test! -f "$ F"; dann echo "Identifizierte Waise: $ f existiert, aber nicht $ F"; Ich kann nicht glauben, wie lange und kompliziert diese anderen Antworten sind. Ja, ich weiß, antworte in einem Kommentar, aber es ist geschützt ...
Niemand

Antworten:

9

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-Bilderliste, 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 zeigt Ihnen, wie Sie es verwenden, wenn Sie es mit der Hilfeoption -hin der Befehlszeile ausführen .

Dieses Problem trat auch bei mir auf, weshalb ich dieses Tool geschrieben habe. Ich verwende meine DSLR, um JPEG- oder RAW + JPEG-Bilder aufzunehmen, niemals nur RAW. Wenn ich verschwommene oder anderweitig schlechte Aufnahmen aussortiere, benutze ich die JPEGs, um sie schnell anzusehen und die schlechten zu löschen. Dadurch habe ich übrig gebliebene RAW-Bilder, von denen ich (aus einem bestimmten Grund) die passenden JPEGs gelöscht habe.

pklaus
quelle
5

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

ok Warnung! Sei vorsichtig mit diesem Skript! - MACH EIN BACKUP

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

2) Geben Sie dann Folgendes in die Fledermausdatei 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 zu dem Ordner mit der Datei clean.bat. 4) Führen Sie clean.bat aus

Grundsätzlich ist der Ablauf des Skripts

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

Bitte testen Sie dies!

UPDATE: Skriptänderung wurde vorgenommen, um mit Ordnern zu arbeiten, in denen Leerzeichen enthalten sind

rauben
quelle
2
+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 dies erfüllt fast alle meine Anforderungen. Habe das Skript getestet 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 Vorgänge ändern zu können.
Jahaziel
Fantastisch, du hast 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
@ al-h - kannst du dann bitte als richtig ankreuzen? danke
Rob
Rob Ich bin mir nicht sicher, was du mit "Kannst du bitte als richtig ankreuzen?" Meinst. Ich sehe keinen Ort, an dem ich einen korrekten Link überprüfen kann.
Al H
Eines ist mir aufgefallen. Dies funktioniert nicht bei Ordnern auf dem Desktop (löscht alle JPG- und NEF-Dateien). Testen Sie daher zuerst. Ich verwende Windows XP Pro.
Al H
1

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

Es sucht rekursiv im aktuellen Verzeichnis ".". Es werden alle Bilder in allen Ordnern berücksichtigt.

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")
Peter Pete
quelle
Benennen Sie einfach ".cr2" in ".nef" um
Peter Pete
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.
Saaru Lindestøkke
Tag auch. Die pause.exe habe ich nur eingefügt, damit das Python-Ding nicht verschwindet, sobald es fertig ausgeführt wird, nachdem ich es im Explorer doppelklickt habe. Es steht Ihnen frei, diese Zeile zu entfernen, und voila, sie ist plattformunabhängig. Die Verwendung von os-abhängigen Dingen ist eine schlechte Praxis, und da ich sie ursprünglich für mich geschrieben habe, war ich faul: D Zumindest habe ich Pfade nicht mit naiven Schrägstrichen verkettet oder os spezifische Funktionen zum Löschen von Dateien verwendet.
Peter Pete
Es ist auch für Python 3.x-Versionen geschrieben. Wenn Sie möchten, dass es 2.x-freundlich ist, ändern Sie einfach den gesamten Druck ("etwas"), um "etwas" zu drucken
Peter Pete