Desduplicar y luego mostrar nombres/cadenas únicos

Trabajando en SEO, tengo un sitio de cliente que tiene cientos, tal vez miles, de imágenes cargadas.

Rastreé el sitio con la araña Screaming Frog SEO y segmenté los datos de rastreo para enumerar todas las imágenes en uso en el sitio y descargué una copia local de la carpeta donde se cargan las imágenes.

No necesito comparar los archivos reales, solo 2 listas de los nombres de todos los archivos (estos u otros archivos, tareas como esta son bastante comunes para mí).

Me siento cómodo con Sublime Text (y sus múltiples cursores y funciones avanzadas de búsqueda y reemplazo) y estoy familiarizado con herramientas de línea de comandos como grep. (Usuario Mac)

Supongo que el primer paso sería eliminar los duplicados dentro de cada lista y luego comparar las listas que producirían una lista de archivos que están tanto en la "lista 1" como en la "lista 2" y/o que no están en la "lista 1". pero están en la "lista 2".

Respuestas (4)

Puede usar VLOOKUP()la función en Excel (o en una hoja de cálculo equivalente). Es la forma más rápida y no requiere programación. BUSCARV está bien descrito en Internet. Pero si te quedas atascado en algún lugar, agrega el comentario y te ayudaré.

La posible limitación es el límite de altura de la hoja: puede tener hasta 1 048 576 filas.

Cuando miré las dos respuestas anteriores, eran "correctas" y las marqué como tales.

Al resolverlo, un amigo mío me habló del comando Bash para "único".

Resulta que se uniqusa junto consort.

Una vez que supe el nombre, una búsqueda rápida arrojó esta respuesta de Stackoverflow .

¿Podría incluir un ejemplo en su respuesta? ¡Gracias!

Yo usaría python , (ya instalado en mac/linux/unix y disponible para Windows) , algo como:

from glob import glob

actual_files = set(glob('/path/to/images/*.jpg')) # The actual files as a set

with open('list/of/Images/Referenced') as f: # Assuming that you have the referenced files as one per line with just the image tags
   rf = [fp for fp in f.readlines().split('/')[-1]] # You only need the actual filename
referenced_files = set(rf) # Make a list of unique references
unused = actual_files - referenced_files
print('Files Present But Unused:', unused)
missing = referenced_files - actual_files
print ('Files Referenced But Missing;', missing)

NB No he probado lo anterior y asumo que su lista de archivos es una ruta al archivo por línea sin nada más en la línea.

Tenga en cuenta que podría usar un rastreador de Python, ( scrapy ), para rastrear el sitio y ssh remoto, también desde Python, para obtener la lista para automatizar todo el proceso si necesita hacer algo como esto regularmente.

Dados dos archivos ordenados, el comando commimprime las líneas que son únicas para un archivo u otro. Primero deberá eliminar la parte del directorio, que sed. Utilícelo comm -12para ver las líneas comunes, comm -23para ver las líneas exclusivas del primer archivo y comm -13para ver las líneas exclusivas del segundo archivo.

<remote-name-list.txt sed -e 's!.*/!!' | sort >remote-name-list.sorted.txt
<local-name-list.txt sed -e 's!.*/!!' | sort >local-name-list.sorted.txt
comm -23 remote-name-list.sorted.txt local-name-list.sorted.txt >remote-only.txt

Si solo desea ver una lista de nombres sin duplicación, puede usar sort -u. Si está interesado en los duplicados, acceda a uniq.

<local-name-list.txt sed -e 's!.*/!!' | sort | uniq -c | grep -v '^ *1 '

Si en algún momento desea comparar el contenido del archivo, puede usar fdupes ( disponible en Homebrew ). Para buscar imágenes visualmente similares, puede usar findimagedupes .

Gracias por la respuesta detallada. Todavía no he tenido tiempo de probarlo pero me da mucho de lo que aprender. Y todo lo que está disponible en Homebrew es excelente, ya que es muy fácil de utilizar.