Línea de comando OSX Buscar nombres de archivos duplicados con diferentes extensiones

Línea de comando OSX Buscar nombres de archivos duplicados con diferentes extensiones

Revisé todas las preguntas similares + instalé algunas utilidades de línea de comandos como duff pero sin éxito.

En mi directorio de Imágenes, tengo imágenes con el mismo nombre pero con diferentes extensiones (jpg y png). Solo quiero imprimir los nombres de los archivos duplicados con diferentes extensiones. (por ejemplo, foo.jpg y foo.png) O al menos un nombre de archivo (foo)

Hasta ahora probé estos métodos.

find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq

find . -type f \( -name "*.jpg" -o -name "*.png" \)

La mayoría de estos comandos me devuelven elNadaOTodos los archivosOúniconombres de archivos pero no elLos duplicados.

Respuesta1

Sugeriría una modificación de su segundo comando:

find . -type f -name "*.jpg" | \
    while read -r f; do [ -e "${f%.jpg}.png" ] && echo "${f%.jpg}"; done

Esto busca todos .jpglos archivos, comprueba si el .pngarchivo correspondiente existe y muestra la ruta completa sin las extensiones.

Tenga en cuenta que si hay muchos menos .pngarchivos, será más eficiente buscarlos y comprobar los .jpgarchivos correspondientes.

[Probado con bashUbuntu 18.04.1.]

Respuesta2

Acepto y agradezco la respuesta. Mientras tanto, obtuve este script de Python que funcionó un poco cerca de lo que estaba buscando. Intenté encontrar la fuente pero no pude encontrarla en cientos de pestañas que busqué.

#!/usr/bin/env python
# Syntax: duplicates.py DIRECTORY
import os, sys
top = sys.argv[1]
d = {}

for root, dirs, files in os.walk(top, topdown=False):
  for name in files:
    fn = os.path.join(root, name)
    basename, extension = os.path.splitext(name)

    basename = basename.lower() # ignore case

    if basename in d:
        print(d[basename])
        print(fn)
    else:
        d[basename] = fn

Guarde este archivo como duplicados.py, asígnele derechos y luego ejecútelo en la carpeta.

./duplicates.py Images

Respuesta3

Debe usar uniq -cpara obtener los recuentos y luego realizar una ordenación inversa al final para enumerar primero los duplicados. Al final awkse utiliza para filtrar líneas que comienzan con 2 o más.

$ find . -type f -exec sh -c 'basename ${0%.*}' {} \; | sort | uniq -c | sort -r | awk 'int($1)>=2'
   2 foo

Aquí, %.*quita la extensión, así foo.x.yse convierte foo.x.

En lugar de un simple find . -type f, que encontraría todos los archivos, también puede filtrar archivos *.jpgo *.pngcomo en su segundo comando.

información relacionada