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

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

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

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

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. 
  • Сохранение первого экземпляра дубликатов
  • Фильтровать дубликаты имен файлов с помощью tar
  • Поиск и список дубликатов каталогов
  • Считайте и объедините последовательные паттерны
  • Номер одной строки в каждом текстовом файле
  • Найти файлы дубликатов файлов и заглавные буквы rm
  • Не удается установить второй жесткий диск на CentOS 6.6 - Дублировать имя VG
  • Как дублировать абзац с одной измененной строкой
  • Как удалить дубликаты файлов с помощью bash
  • Сохранение строк повторяется определенное количество раз
  • Идентификация повторяющихся полей и печать как с awk
  • Interesting Posts

    Отключить тачпад в скрипте инициализации

    Как проверить содержимое / dev / sdt?

    Как использовать Ctrl-Insert для копирования из XTerm?

    Настройка Org-режима для открытия PDF-файлов с помощью evince

    Приложение в терминале все еще работает, но не доступно напрямую

    Настройка сети 802.11s для мобильных устройств для связи с проводным сервером

    Можем ли мы использовать два расширения фигурных скобок вместе?

    Bash: слияние имени папки из переменной с именем файла

    как сохранить строки с определенной строкой

    Как установить последнюю версию Eclipse через терминал

    Как определить и преобразовать текущее время в течение нескольких секунд, прошедших в течение текущего дня?

    Могу ли я создать суперпользователя * super *, чтобы у меня действительно был пользователь, который может лишить права root?

    Как можно отключить гладкую прокрутку клавиатуры в gedit (GNOME 3.14 / Fedora 21)?

    Настройте галочку для автоматического переключения между LAN и WLAN

    WD MyBook 3TB – восстановление Gparted и восстановление жестких дисков?

    Linux и Unix - лучшая ОС в мире.