¿Cómo eliminar archivos sin procesar "no utilizados" que no coinciden con .jpg?

Disparo en RAW+JPG, es decir, NEF y JPG. Después de ver a veces cientos de imágenes (usando un programa simple) y borrar los JPG, tengo muchos archivos NEF sobrantes innecesarios. Si hubiera una secuencia de comandos 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.

¿Puede proporcionar un enlace a esa pregunta aquí? La respuesta a esto seguramente será un script de shell; tal vez pregunte en SuperUser en su lugar, porque si tiene una buena definición de lo que necesita eliminar (por nombre de archivo), esta es una tarea bastante trivial.
Para el futuro, solo use Geeqie. Elimina los archivos RAW coincidentes automáticamente y cualquier otro que se defina como un archivo 'sidecar' según la configuración.
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 guion para esto?
En Bash: huérfano=.nef; padre=.jpeg; for f en *"$huérfano"; do F="${f%$huérfano}$padre"; si prueba! -f "$F"; luego echo "Huérfano identificado: $f existe pero no $F"; fi done No puedo creer lo largas y complicadas que son esas otras respuestas. Sí, lo sé, respondiendo en un comentario, pero está protegido...

Respuestas (3)

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 sin procesar huérfanas (en mi caso *.CR2, archivos sin JPEG coincidente) a una carpeta de respaldo. Opcionalmente, puede decirle a la secuencia de comandos que elimine los archivos.

Aquí hay un esquema 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 de la lista de imágenes RAW que exista una coincidencia en la lista JPEG;
    si no, agregue esta imagen a una lista de imágenes sin procesar huérfanas.
  • Mueva las imágenes de 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 ejecuta con la opción de ayuda -hen la línea de comando.

Este problema también me ocurrió, por eso escribí esta herramienta. Estoy usando mi DSLR para tomar imágenes JPEG o RAW+JPEG, nunca solo RAW. Cuando clasifico tomas borrosas o malas, uso 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 correspondientes (por una razón).

Usando la pregunta que mencionaste: te he escrito un guión

vale aviso! ¡Cuidado con este guión! - HACER UNA COPIA DE SEGURIDAD

1) Cree un archivo bat llamado clean.bat y colóquelo 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

  • Haz un directorio llamado Keep
  • Mueva todos los archivos NEF coincidentes a la carpeta de mantenimiento
  • Mueva todos los Jpegs a la carpeta de mantenimiento
  • Luego elimine todos los archivos de la carpeta de origen
  • Mover los archivos guardados hacia atrás
  • Eliminar la carpeta de mantenimiento

¡Por favor, POR FAVOR pruebe esto!

ACTUALIZACIÓN: se realizó un cambio de secuencia de comandos para trabajar con carpetas que tienen espacios en ellas

¡+1 para una solución sencilla y única! He estado necesitando esta solución durante mucho tiempo. Solía ​​elaborar comandos pegando la salida DIR en Excel y usando operadores complicados como vlookup para generar comandos individuales, pero esto cubre casi todas mis necesidades. Probé el script y está completamente bien para mí. Tuve que consultar varias referencias para comprender completamente el script y poder modificarlo para otras operaciones similares.
¡¡¡Fantástico, me habéis ahorrado horas de tedioso trabajo!!! Lo probé varias veces y funciona demasiado rápido. Es justo lo que estaba buscando.
@al-h: ¿puede marcar como correcto entonces? Gracias
Rob, no estoy seguro de lo que quieres decir con "por favor, ¿puedes marcar como correcto?" No veo ningún lugar donde pueda verificar un enlace correcto.
Una cosa que noté. Esto no funciona en las carpetas del escritorio (borra todos los archivos jpg y NEF), así que pruebe primero. Estoy ejecutando Windows XP Pro.
@al-h Hay una casilla de verificación atenuada junto a mi respuesta. - No estoy seguro de por qué esto no funcionaría en el escritorio, ¿funciona en cualquier otro lugar? - lo lamento
Se cambió la secuencia de comandos para tener en cuenta los espacios en el nombre de la carpeta.
Supongo que tengo la idea para mi próxima característica en mi visor de imágenes: "[x] vincular jpg y raw [x] Ver el jpg [] ver el raw".

Aquí está mi secuencia de comandos de python para eliminar cr2 sin 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")
Simplemente cambie el nombre de ".cr2" a ".nef"
No estoy familiarizado con Python, pero veo que se refiere a "pause.exe" en la última línea. ¿Significa esto que solo funciona en Windows? Pensé que Python era independiente de la plataforma.
Gdía. 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. Eres 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 dado que inicialmente lo escribí para mí, estaba siendo perezoso: D Al menos no concatené rutas con barras ingenuas ni usé funciones de eliminación de archivos específicas del sistema operativo.
También está escrito para las versiones de Python 3.x. Si desea que sea compatible con 2.x, simplemente cambie toda la impresión ("algo") para imprimir "algo"