проверьте, находятся ли все файлы из папки в другой папке

У меня в основном есть каталог с большим количеством изображений. Теперь я хочу проверить, находятся ли все эти изображения в каталоге b . Дело в том, что много изображений в b не находится непосредственно в b а в подкаталогах.

Также я не хочу зависеть от имен файлов, но содержимое файла.

(из-за тега bash: я бы предпочел ответ bash, но если это какой-то другой язык или если он использует другую программу, все в порядке)

  • Идентификация повторяющихся полей и печать как с awk
  • Как удалить дубликаты файлов с помощью bash
  • Считайте и объедините последовательные паттерны
  • Как дублировать абзац с одной измененной строкой
  • Дублировать и отправлять исходящие UDP-пакеты через два интерфейса, ориентированные на Интернет.
  • Удалите все повторяющиеся слова из строки, используя сценарий оболочки
  • Используйте basename для анализа списка путей, хранящихся в файле
  • Сохранение первого экземпляра дубликатов
  • 3 Solutions collect form web for “проверьте, находятся ли все файлы из папки в другой папке”

    Поскольку вы хотите сравнить их по контенту, использование хэшей, похоже, является способом сделать это.

    Вы можете использовать команду find для получения списка путей к файлу каталога. Параметр -type f будет содержать все каталоги и только пути вывода к обычным файлам. -exec md5sum {} \; option примет найденные пути и передаст их команде md5sum чтобы превратиться в хеш-список md5 + их пути к файлу ('md5_hash / path / to / file').

    Мы передаем этот список в команду cut . Первый вариант -f 1 говорит, что он принимает только первый столбец (хеши). Второй -d ' ' говорит ему использовать пробельный символ как разделитель между столбцами. Значение по умолчанию – TAB.

    Мы передаем этот список хэшей в команду sort, чтобы упростить diff .

    Оператор <( command ) называется Process Substitution . Он принимает вывод команды и превращает ее в псевдофайл для команд, требующих их в качестве входных данных (для менее простого объяснения следует ссылка). Таким образом, он выглядит так, как будто мы хотим сравнить два файла.

     :~$ diff <(find folder1/ -type f -exec md5sum {} \; | cut -f 1 -d ' ' | sort) \ <(find folder2/ -type f -exec md5sum {} \; | cut -f 1 -d ' ' | sort) 

    Примечание. Не забудьте заменить папку1 / и папку2 / вашими фактическими папками.

    Это даст вам список хешей md5 файлов, которые находятся только в одном или другом.

    Если вы хотите узнать, какие файлы на самом деле отсутствуют, вы можете:

     :~$ find folder1/ -type f -exec md5sum {} \; | sort | grep my_md5_hash 

    Если у вас есть много файлов для проверки, было бы разумно сохранить результаты двух команд <(find ...) и сравнить их как:

     :~$ diff list1.txt list2.txt :~$ cat list1.txt | grep my_md5_hash 

    См. Ответ на аналогичный вопрос две недели назад.

     find . -type f -exec md5sum {} + | sort | sed 's/ */!/1' | awk -F\| 'BEGIN{first=1}{if($1==lastid){if(first){first=0;print lastid, lastfile}print$1, $2} else first=1; lastid=$1;lastfile=$2}' 

    Предполагая, что это все файлы * .jpg, выполните:

    Чтобы найти файлы:

    grep -Ff <(for i in </path/to/directory/a>/*.jpg ; do md5sum $i | awk {'print $1'}; done) <(find </path/to/directoryb/ -iname "*.jpg" | xargs md5sum)

    В цикле for создается список контрольных сумм md5 всех файлов *.jpg в каталоге «a», и в результате find здесь будет создан список контрольных сумм md5 всех файлов *.jpg в каталоге «b» (включая суды).

    grep -fF будет сравнивать эти два списка, а полная команда будет выдавать 2-х столбчатый вывод с 1-й колонией, являющейся контрольной суммой md5 файлов, которая присутствует, и 2-й coloumns является именем файла (с полным путем) файлов, которые соответствуют в каталоге 'b'. Вы можете использовать дополнительный | awk {'print $2'} | awk {'print $2'} если вы хотите получить только имена файлов.

    Чтобы найти файлы, не присутствующие:

    grep -vFf <(for i in </path/to/directory/a>/*.jpg ; do md5sum $i | awk {'print $1'}; done) <(find </path/to/directoryb/ -iname "*.jpg" | xargs md5sum )

    Выполняет то же самое, что и первая команда grep, но использует параметр -v для отображения только того, что не соответствует.

    Что ты ищешь:

    Если все файлы в каталоге «a» присутствуют, второй grep не должен возвращать какой-либо вывод.

    Замените * .jpg на любое расширение, которое вы, возможно, захотите найти.

    На странице man grep :

      -f FILE, --file=FILE Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. (-f is specified by POSIX.) -F, --fixed-strings Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is specified by POSIX.) -v, --invert-match Invert the sense of matching, to select non-matching lines. 
    Linux и Unix - лучшая ОС в мире.