Работая над SEO, у меня есть клиентский сайт, на котором загружены сотни, а то и тысячи изображений.
Я просканировал сайт с помощью SEO-паука Screaming Frog и сегментировал данные сканирования, чтобы вывести список всех изображений, используемых на сайте, и я загрузил локальную копию папки, в которую загружены изображения.
Мне не нужно сравнивать реальные файлы, достаточно 2 списков названий всех файлов (те или иные файлы, такие задачи у меня довольно распространены).
Мне удобно работать с Sublime Text (с его многочисленными курсорами и расширенными функциями поиска и замены), и я знаком с инструментами командной строки, такими как grep
. (пользователь Mac)
Я предполагаю, что первым шагом будет устранение дубликатов в каждом списке, а затем сравнение списков, которое даст список файлов, которые находятся как в «списке 1», так и в «списке 2» и/или которые не находятся в «списке 1». ", но находятся в "списке 2".
Вы можете использовать VLOOKUP()
функцию в Excel (или в эквивалентной электронной таблице). Это самый быстрый способ и не требует программирования. Функция ВПР хорошо описана в Интернете. Но если вы где-то застряли, добавьте комментарий, и я вам помогу.
Возможным ограничением является ограничение по высоте листа - он может иметь до 1 048 576 строк.
Когда я просмотрел оба ответа выше, они были «правильными», и я отметил их как таковые.
Разбираясь с этим, мой друг рассказал мне о команде Bash для «уникального».
Оказывается, он uniq
используется вместе сsort.
Как только я узнал название, быстрый поиск выдал этот ответ Stackoverflow .
Я бы использовал python ( уже установленный на mac/linux/unix и доступный для Windows) , что-то вроде:
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 . Я не проверял вышеизложенное и предполагаю, что ваш список файлов — это один путь к файлу на строку, и больше ничего в строке нет.
Обратите внимание, что вы можете использовать поисковый робот python ( scrapy ) для сканирования сайта и удаленного ssh, также из python, чтобы получить список для автоматизации всего процесса, если вам нужно делать что-то подобное регулярно.
Имея два отсортированных файла, команда comm
выводит строки, уникальные для того или иного файла. Сначала вам нужно удалить часть каталога, которая sed
. Используйте comm -12
для просмотра общих строк, comm -23
для просмотра строк, уникальных для первого файла, и comm -13
для просмотра строк, уникальных для второго файла.
<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
Если вы хотите увидеть только список имен без дублирования, вы можете использовать sort -u
. Если вас интересуют дубликаты, направьте их в uniq
.
<local-name-list.txt sed -e 's!.*/!!' | sort | uniq -c | grep -v '^ *1 '
Если в какой-то момент вы захотите сравнить содержимое файла, вы можете использовать fdupes ( доступно в Homebrew ). Для поиска визуально похожих изображений можно использовать findimagedupes .
Николя Рауль