¿Cómo eliminar archivos en bruto "no utilizados" que no tienen coincidencia .jpg?

10

Disparo RAW + JPG, a saber, NEF y JPG. Después de ver a veces cientos de imágenes (usando un programa simple) y eliminar los JPG, tengo muchos archivos NEF sobrantes innecesarios. Si hubiera un script para eliminar cualquier archivo NEF huérfano en el directorio, sería muy útil. Leí una pregunta similar aquí " ¿Cómo eliminar archivos JPG, pero solo si existe el archivo RAW correspondiente? " Y la solución presentada con el Símbolo del sistema funciona muy bien. Me preguntaba si había uno disponible para mi situación.

Al H
fuente
¿Puedes proporcionar un enlace a esa pregunta aquí? La respuesta a esto seguramente será una secuencia de comandos de shell; tal vez pregunte en SuperUser, porque si tiene una buena definición de lo que necesita eliminar (por nombre de archivo), esta es una tarea bastante trivial.
Ben Parsons
1
Para el futuro, solo usa Geeqie. Elimina los archivos RAW coincidentes automáticamente y cualquier otro que se defina como un archivo 'sidecar' basado en la configuración.
Itai
Tengo mi configuración de la siguiente manera: NEF: \\ Photos \ RAW \ YYYY \ YYYY-MM-DD \ original.nef Jpegs: \\ Photos \ RAW \ YYYY \ YYYY-MM-DD \ original.jpeg De todos modos, puedo aplicar esto guión para esto?
En Bash: huérfano = .nef; padre = .jpeg; para f en * "$ huérfano"; do F = "$ {f% $ huérfano} $ padre"; si prueba! -f "$ F"; luego echo "Huérfano identificado: $ f existe pero no $ F"; No puedo creer lo largas y complicadas que son esas otras respuestas. Sí, lo sé, respondiendo en un comentario, pero está protegido ...
Nadie el

Respuestas:

9

Escribí un script en Python para hacer el trabajo por mí. Se llama remove-orphaned-raw-images.pyy lo publiqué en Github .

Básicamente, itera sobre todos los archivos en una carpeta determinada y mueve imágenes en bruto huérfanas (en mi caso, *.CR2archivos sin JPEG coincidente) a una carpeta de copia de seguridad. Opcionalmente, puede indicarle al script que realmente elimine los archivos.

Aquí hay un resumen del algoritmo:

  • Obtenga una lista de todos los archivos en el directorio seleccionado.
  • Ordene esos archivos en archivos RAW y JPEG (añádalos a listas separadas).
  • Compruebe para cada elemento en la lista de imágenes RAW que existe una coincidencia en la lista JPEG;
    si no, agregue esta imagen a una lista de imágenes en bruto huérfanas.
  • Mueva las imágenes en la lista de imágenes huérfanas a una carpeta de respaldo
    (o elimínelas directamente si lo desea explícitamente).

La herramienta le dirá cómo usarla cuando se ejecute con la opción de ayuda -hen la línea de comando.

Este problema también se me ocurrió, por eso escribí esta herramienta. Estoy usando mi DSLR para tomar imágenes JPEG o RAW + JPEG, nunca solo RAW. Cuando clasifico fotos borrosas o malas, utilizo los archivos JPEG para echarles un vistazo rápidamente y eliminar las malas. Esto me deja con imágenes RAW sobrantes de las cuales eliminé los archivos JPEG coincidentes (por una razón).

pklaus
fuente
5

Usando la pregunta que mencionaste: te escribí un guión

ok advertencia! ten cuidado con este script! - HACER UNA COPIA DE SEGURIDAD

1) Cree un archivo bat llamado clean.bat y póngalo en el directorio con el que desea trabajar

2) Luego ingrese lo siguiente en el archivo 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) Abra el símbolo del sistema como administrador y navegue a la carpeta con clean.bat 4) ejecute clean.bat

Básicamente, el flujo del guión es

  • Haga un directorio llamado Keep
  • Mueva todos los archivos NEF coincidentes a la carpeta de mantenimiento
  • Mueva todos los archivos JPEG a la carpeta de mantenimiento
  • Luego elimine todos los archivos de la carpeta de origen
  • Mueva los archivos de guardar
  • Eliminar la carpeta de mantenimiento

¡Por favor, por favor pruebe esto!

ACTUALIZACIÓN: Se realizó un cambio de script para trabajar con carpetas que tienen espacios en ellas

Robar
fuente
2
¡+1 para una solución directa y única! He estado necesitando esta solución por mucho tiempo. Solía ​​elaborar comandos pegando la salida de DIR en Excel, y usando operadores complicados como vlookup para generar comandos individuales, pero esto cubre casi todas mis necesidades. Probé el guión y está completamente bien para mí. Tuve que consultar varias referencias para comprender completamente el script y poder modificarlo para otras operaciones similares.
Jahaziel
¡Fantástico, me has ahorrado horas de tedioso trabajo! Lo intenté varias veces y funciona demasiado rápido. Es justo lo que estaba buscando.
Al H
@ al-h - ¿puedes marcar como correcto entonces? gracias
Rob
Rob, no estoy seguro de lo que quieres decir con "por favor, ¿puedes marcarlo como correcto?" No veo un lugar donde pueda verificar un enlace correcto.
Al H
Una cosa que noté. Esto no funciona en las carpetas del escritorio (elimina todos los archivos jpg y NEF), así que pruebe primero. Estoy ejecutando Windows XP Pro.
Al H
1

Aquí está mi script de Python para eliminar cr2's w / oa jpeg.

Busca recursivamente dentro del directorio actual, ".". Considera todas las imágenes en todas las carpetas.

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
fuente
Simplemente cambie el nombre de ".cr2" a ".nef"
Peter pete
No estoy familiarizado con Python, pero veo que se refiere a "pause.exe" en la última línea. ¿Esto significa que solo funciona en Windows? Pensé que Python era independiente de la plataforma.
Saaru Lindestøkke
Gday El pause.exe solo lo puse para que Python thingo no desaparezca tan pronto como termine de ejecutarse, después de hacer doble clic en el explorador. Usted es libre de eliminar esta línea y listo, será independiente de la plataforma. Usar cosas dependientes del sistema operativo es una mala práctica, y desde que inicialmente lo escribí para mí, estaba siendo flojo: D Al menos no concatenaba rutas con barras ingenuas ni usaba funciones específicas de eliminación de archivos.
Peter pete
También está escrito para versiones de Python 3.x. Si desea que sea amigable 2.x simplemente cambie toda la impresión ("algo") para imprimir "algo"
Peter Peter