
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 .jpg
los archivos, comprueba si el .png
archivo correspondiente existe y muestra la ruta completa sin las extensiones.
Tenga en cuenta que si hay muchos menos .png
archivos, será más eficiente buscarlos y comprobar los .jpg
archivos correspondientes.
[Probado con bash
Ubuntu 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 -c
para obtener los recuentos y luego realizar una ordenación inversa al final para enumerar primero los duplicados. Al final awk
se 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.y
se convierte foo.x
.
En lugar de un simple find . -type f
, que encontraría todos los archivos, también puede filtrar archivos *.jpg
o *.png
como en su segundo comando.