Comment supprimer les fichiers bruts «inutilisés» qui n'ont pas de correspondance .jpg?

10

Je photographie RAW + JPG, à savoir NEF et JPG. Après avoir vu parfois des centaines d'images (à l'aide d'un programme simple) et supprimé les JPG, j'ai de nombreux fichiers NEF inutiles. S'il y avait un script pour supprimer les fichiers NEF orphelins dans le répertoire, ce serait très utile. J'ai lu une question similaire ici " Comment supprimer des fichiers JPG, mais seulement si le fichier RAW correspondant existe? " Et la solution présentée avec l'invite de commande fonctionne très bien. Je me demandais si un était disponible pour ma situation?

Al H
la source
Pouvez-vous fournir un lien vers cette question ici? La réponse à cette question sera certainement un script shell - demandez plutôt à SuperUser, car si vous avez une bonne définition de ce que vous devez supprimer (par nom de fichier), c'est une tâche assez banale.
Ben Parsons
1
Pour l'avenir, utilisez simplement Geeqie. Il supprime automatiquement les fichiers RAW correspondants et tout autre qui est défini comme un fichier 'sidecar' basé sur la configuration.
Itai
J'ai ma configuration comme suit: NEF: \\ Photos \ RAW \ YYYY \ YYYY-MM-DD \ original.nef Jpegs: \\ Photos \ RAW \ YYYY \ YYYY-MM-DD \ original.jpeg Quoi qu'il en soit, je peux appliquer ce script à cela?
Dans Bash: orphan = .nef; parent = .jpeg; pour f dans * "$ orphelin"; do F = "$ {f% $ orphan} $ parent"; si test! -f "$ F"; puis echo "Orphelin identifié: $ f existe mais pas $ F"; fi done Je ne peux pas croire combien de temps et compliqué ces autres réponses sont. Oui, je sais, répondant en commentaire, mais c'est protégé ...
Personne

Réponses:

9

J'ai écrit un script en Python pour faire le travail pour moi. Il s'appelle remove-orphaned-raw-images.pyet je l'ai publié sur Github .

Fondamentalement, il itère tous les fichiers d'un dossier donné et déplace les images brutes orphelines (dans mon cas, les *.CR2fichiers sans JPEG correspondant) vers un dossier de sauvegarde. En option, vous pouvez indiquer au script de supprimer réellement les fichiers.

Voici un aperçu de l'algorithme:

  • Obtenez une liste de tous les fichiers du répertoire sélectionné.
  • Triez ces fichiers en fichiers RAW et JPEG (ajoutez-les à des listes séparées).
  • Vérifiez pour chaque élément de la liste d'images RAW qu'il existe une correspondance dans la liste JPEG;
    sinon, ajoutez cette image à une liste d'images brutes orphelines.
  • Déplacez les images de la liste des images orphelines dans un dossier de sauvegarde
    (ou supprimez-les directement si vous le souhaitez explicitement).

L'outil vous dira comment l'utiliser lorsqu'il est exécuté avec l'option d'aide -hsur la ligne de commande.

Ce problème m'est également apparu, c'est pourquoi j'ai écrit cet outil. J'utilise mon reflex numérique pour prendre des images JPEG ou RAW + JPEG, jamais seulement RAW. Lors du tri de photos floues ou autrement mauvaises, j'utilise les JPEG pour les consulter rapidement et supprimer les mauvaises. Cela me laisse des images RAW restantes dont j'ai supprimé les JPEG correspondants (pour une raison).

pklaus
la source
5

En utilisant la question que vous avez mentionnée - je vous ai écrit un script

ok avertissement! soyez prudent avec ce script! - FAIRE UNE SAUVEGARDE

1) Créez un fichier bat appelé clean.bat et placez-le dans le répertoire avec lequel vous souhaitez travailler

2) Entrez ensuite ce qui suit dans le fichier bat

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) Ouvrez l'invite de commande en tant qu'administrateur et accédez au dossier contenant le fichier clean.bat 4) exécutez clean.bat

Fondamentalement, le flux du script est

  • Créez un répertoire appelé Keep
  • Déplacez tous les fichiers NEF correspondants vers le dossier Keep
  • Déplacez tous les fichiers Jpeg dans le dossier Keep
  • Ensuite, supprimez tous les fichiers du dossier source
  • Déplacer les fichiers à conserver
  • Supprimer le dossier de conservation

S'il vous plaît, veuillez tester cela!

MISE À JOUR: modification du script pour fonctionner avec des dossiers contenant des espaces

Rob
la source
2
+1 pour une solution simple et unique! J'avais besoin de cette solution depuis longtemps. J'avais l'habitude d'élaborer des commandes en collant la sortie DIR dans Excel et en utilisant des opérateurs compliqués comme vlookup pour générer des commandes individuelles, mais cela répond à presque tous mes besoins. Testé le script et son tout à fait bien pour moi. J'ai dû consulter plusieurs références pour bien comprendre le script et pouvoir le modifier pour d'autres opérations similaires.
Jahaziel
Fantastique, vous m'avez sauvé des heures de travail fastidieux !!! Je l'ai essayé plusieurs fois et ça marche trop vite. C'est exactement ce que je cherchais.
Al H
@ al-h - veuillez alors cocher la case correcte? merci
Rob
Rob Je ne suis pas sûr de ce que vous entendez par "s'il vous plaît pouvez-vous cocher comme correct" Je ne vois pas où je peux vérifier un lien correct.
Al H
Une chose que j'ai remarquée. Cela ne fonctionne pas sur les dossiers du bureau (supprime tous les fichiers jpg et NEF), alors testez d'abord. J'utilise Windows XP Pro.
Al H
1

Voici mon script python pour supprimer le jpeg sans cr2.

Il recherche récursivement dans le répertoire courant, ".". Il prend en compte toutes les images de tous les dossiers.

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
la source
Renommez simplement ".cr2" en ".nef"
Peter pete
Je ne connais pas Python, mais je vois qu'il fait référence à "pause.exe" dans la dernière ligne. Est-ce à dire que cela ne fonctionne que sur Windows? Je pensais que Python était indépendant de la plateforme.
Saaru Lindestøkke
Gday. Le pause.exe que j'ai mis seulement pour que le truc python ne disparaisse pas dès que son exécution est terminée, après avoir double-cliqué dessus sur l'explorateur. Vous êtes libre de supprimer cette ligne et le tour est joué indépendamment de la plateforme. Utiliser des trucs dépendants du système d'exploitation est une mauvaise pratique, et depuis que je l'ai écrit pour moi, j'étais paresseux: D Au moins, je n'ai pas concaténé de chemins avec des barres obliques naïves ni utilisé des fonctions de suppression de fichiers spécifiques à os.
Peter pete
Il est également écrit pour les versions Python 3.x. Si vous voulez qu'il soit convivial 2.x, il suffit de changer toutes les impressions ("quelque chose") pour imprimer "quelque chose"
Peter pete