Come eliminare i file grezzi "non utilizzati" che non hanno una corrispondenza .jpg?


10

Faccio RAW + JPG, ovvero NEF e JPG. Dopo aver visualizzato a volte centinaia di immagini (usando un semplice programma) ed eliminato i file JPG, ho molti file NEF rimanenti non necessari. Se fosse presente uno script per eliminare eventuali file NEF orfani nella directory, sarebbe molto utile. Ho letto una domanda simile qui " Come eliminare i file JPG, ma solo se esiste il file RAW corrispondente? " E la soluzione presentata con il prompt dei comandi funziona molto bene. Mi chiedevo se uno fosse disponibile per la mia situazione?


Puoi fornire un link a questa domanda qui? La risposta a questo sarà quasi sicuramente uno script di shell - forse chiedilo invece a SuperUser, perché se hai una buona definizione di ciò che devi eliminare (per nome file), questo è un compito abbastanza banale.
Ben Parsons,

1
Per il futuro, usa Geeqie. Elimina automaticamente i file RAW corrispondenti e tutti gli altri definiti come file 'sidecar' in base alla configurazione.
Itai,

Ho la mia configurazione come segue: NEF: \\ Foto \ RAW \ YYYY \ YYYY-MM-DD \ original.nef Jpegs: \\ Foto \ RAW \ YYYY \ YYYY-MM-DD \ original.jpeg Comunque posso applicare questo sceneggiatura a questo?

In Bash: orphan = .nef; parent = .jpeg; per f in * "$ orfano"; do F = "$ {f% $ orphan} $ parent"; se prova! -f "$ F"; quindi echo "Identificato orfano: $ f esiste ma non $ F"; fi fatto Non riesco a credere quanto siano lunghe e complicate quelle altre risposte. Sì, lo so, rispondendo nei commenti, ma è protetto ...
Nessuno il

Risposte:


9

Ho scritto una sceneggiatura in Python per fare il lavoro per me. Si chiama remove-orphaned-raw-images.pye l'ho pubblicato su Github .

Fondamentalmente scorre su tutti i file in una determinata cartella e sposta le immagini non elaborate orfane (nel mio caso i *.CR2file senza JPEG corrispondenti) in una cartella di backup. Facoltativamente, puoi dire allo script di eliminare effettivamente i file.

Ecco una descrizione dell'algoritmo:

  • Ottieni un elenco di tutti i file nella directory selezionata.
  • Ordinare questi file in file RAW e JPEG (aggiungerli a elenchi separati).
  • Verificare per ogni elemento nell'elenco di immagini RAW che esista una corrispondenza nell'elenco JPEG;
    in caso contrario, aggiungere questa immagine a un elenco di immagini grezze orfane.
  • Sposta le immagini nell'elenco delle immagini orfane in una cartella di backup
    (o eliminale direttamente se lo desideri esplicitamente).

Lo strumento ti dirà come usarlo quando eseguito con l'opzione di aiuto -hsulla riga di comando.

Questo problema si è verificato anche a me, motivo per cui ho scritto questo strumento. Sto usando la mia DSLR per scattare immagini JPEG o RAW + JPEG, mai solo RAW. Quando risolvo gli scatti sfocati o altrimenti cattivi, uso i JPEG per dare un'occhiata veloce ed eliminare quelli cattivi. Questo mi lascia con le immagini RAW rimaste su cui ho eliminato i JPEG corrispondenti (per un motivo).


5

Usando la domanda che hai menzionato, ti ho scritto una sceneggiatura

ok avviso! stai attento con questo script! - EFFETTUARE UN BACKUP

1) Crea un file bat chiamato clean.bat e mettilo nella directory con cui vuoi lavorare

2) Quindi immettere quanto segue nel file 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) Apri il prompt dei comandi come amministratore e vai alla cartella con clean.bat 4) Esegui clean.bat

Fondamentalmente il flusso della sceneggiatura è

  • Crea una directory chiamata Keep
  • Sposta tutti i file NEF corrispondenti nella cartella Mantieni
  • Sposta tutti i jpeg nella cartella keep
  • Quindi eliminare tutti i file dalla cartella di origine
  • Sposta indietro i file
  • Rimuovi la cartella Mantieni

Per favore, per favore prova questo!

AGGIORNAMENTO: sono state apportate modifiche allo script per funzionare con le cartelle che contengono spazi


2
+1 per una soluzione semplice e intuitiva! Ho bisogno di questa soluzione da molto tempo. Ero abituato a elaborare comandi incollando l'output DIR in Excel e utilizzando operatori complicati come vlookup per generare comandi individuali, ma questo soddisfa quasi tutte le mie esigenze. Ho testato la sceneggiatura e per me va benissimo. Ho dovuto consultare diversi riferimenti per comprendere appieno lo script ed essere in grado di modificarlo per altre operazioni simili.
Jahaziel,

Fantastico, mi hai risparmiato ore di lavoro noioso !!! L'ho provato più volte e funziona troppo velocemente. È proprio quello che stavo cercando.
Al H,

@ al-h - per favore puoi spuntare come corretto allora? grazie
Rob

Rob Non sono sicuro di cosa intendi con "per favore, puoi spuntare come corretto" Non vedo da qualche parte che posso controllare un collegamento corretto.
Al H,

Una cosa che ho notato. Questo non funziona su cartelle sul desktop (elimina tutti i file jpg e NEF), quindi prova prima. Sto eseguendo Windows XP Pro.
Al H,

1

Ecco il mio script Python per eliminare il jpeg w / oa di cr2.

Cerca ricorsivamente all'interno della directory corrente, ".". Considera tutte le immagini in tutte le cartelle.

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")

Basta rinominare ".cr2" in ".nef"
Peter pete il

Non ho familiarità con Python, ma vedo che si riferisce a "pause.exe" nell'ultima riga. Questo significa che funziona solo su Windows? Pensavo che Python fosse indipendente dalla piattaforma.
Saaru Lindestøkke,

Buongiorno. Il pause.exe l'ho inserito solo in modo tale che Python thingo non svanisca non appena è terminata l'esecuzione, dopo che ho fatto doppio clic su Explorer. Sei libero di rimuovere questa linea e voilà sarà indipendente dalla piattaforma. L'uso di roba dipendente dal sistema operativo è una cattiva pratica e, poiché inizialmente l'ho scritto per me, ero pigro: D Almeno non ho concatenato percorsi con barre ingenue né utilizzare funzioni specifiche di eliminazione dei file.
Peter pete,

È anche scritto per le versioni 3.x di Python. Se vuoi che sia amichevole 2.x basta cambiare tutta la stampa ("qualcosa") per stampare "qualcosa"
Peter pete
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.