У меня есть две директории, которые должны содержать одинаковые файлы и иметь одинаковую структуру каталогов.
Я думаю, что что-то не хватает в одном из этих каталогов.
Используя оболочку bash, есть ли способ сравнить мои каталоги и посмотреть, отсутствуют ли в одном из них файлы, присутствующие в другом?
command-line
AndreaNobili
источник
источник
bash --version
?Ответы:
Хороший способ сделать это сравнение - использовать
find
сmd5sum
, а затемdiff
.пример
Используйте find, чтобы вывести список всех файлов в каталоге, затем вычислить хэш md5 для каждого файла и передать его, отсортированный по имени файла, в файл:
Проделайте ту же процедуру с другим каталогом:
Затем сравните результат двух файлов с
diff
:Или как одна команда, использующая подстановку процесса:
Если вы хотите увидеть только изменения:
Команда cut печатает только хеш (первое поле), который сравнивается с помощью diff. В противном случае diff будет печатать каждую строку, поскольку пути к каталогам различаются, даже если хэш-код одинаков.
Но вы не будете знать, какой файл изменился ...
Для этого вы можете попробовать что-то вроде
Эта стратегия очень полезна, когда два сравниваемых каталога не находятся на одном компьютере, и вам необходимо убедиться, что файлы в обоих каталогах совпадают.
Еще один хороший способ выполнить эту работу - использовать
diff
команду Git (могут возникнуть проблемы, когда файлы имеют разные разрешения -> каждый файл будет указан в выводе):источник
find
будут перечислены файлы, будет в целом отличаться между двумя каталогами.Вы можете использовать
diff
команду так же, как и для файлов:Если вы хотите увидеть вложенные папки и -files, вы можете использовать
-r
опцию:источник
diff
работает ли и для каталогов (man diff подтвердил это), но это не рекурсивно проверяет изменения в подкаталогах внутри подкаталогов.a/b/c/d/a
,x/b/c/d/b
. Посмотри, чтоdiff a x
тебе дает.-r
опцию. Это (diff -r a x
) дает мне:Only in a/b/c/d: a. only in x/b/c/d: b.
Через вы не используете Баш, вы можете сделать это с помощью диф с
--brief
и--recursive
:man diff
Включает в себя оба варианта:источник
Вот альтернатива, чтобы сравнить только имена файлов, а не их содержимое:
Это простой способ перечислить отсутствующие файлы, но, конечно, он не обнаружит файлы с одинаковыми именами, но с разным содержимым!
(Лично я использую свой собственный
diffdirs
скрипт, но это часть большой библиотеки .)источник
diff
не поддерживает на данный момент. Но есть и то,comm
что поддерживает его, так как git.savannah.gnu.org/cgit/coreutils.git/commit/… так что, когда дело доходит до ближайшего к вам coreutils, вы можете сделатьcomm -z <(cd folder1 && find -print0 | sort) <(cd folder2 && find -print0 | sort -z)
(чей вывод вам может потребоваться для дальнейшего преобразования в формат вам нужно использовать--output-delimiter
параметр и дополнительные инструменты).Может быть, один из вариантов - запустить rsync два раза:
В предыдущей строке вы получите файлы, которые находятся в dir1 и отличаются (или отсутствуют) в dir2.
То же самое для dir2
Вы можете удалить
-n
опцию, чтобы пройти изменения. Это копирование списка файлов во вторую папку.В этом случае, возможно, хорошим вариантом будет использование
-u
, чтобы избежать перезаписи более новых файлов.Однострочник:
источник
Если вы хотите сделать каждый файл расширяемым и сворачиваемым, вы можете направить вывод
diff -r
в Vim.Сначала давайте дадим Виму правило складывания:
Теперь просто:
Вы можете нажимать
zo
иzc
открывать и закрывать складки. Чтобы выйти из Vim, нажмите:q<Enter>
источник
Довольно простая задача для достижения в python:
Подставьте фактические значения для
DIR1
иDIR2
.Вот пример прогона:
Для удобочитаемости, вот реальный скрипт вместо однострочного:
источник
os.listdir
не дает никакого конкретного заказа. Таким образом, списки могут иметь одни и те же вещи в другом порядке, и сравнение не удастся.Вдохновленный ответом Сергея, я написал свой собственный скрипт на Python для сравнения двух каталогов.
В отличие от многих других решений, он не сравнивает содержимое файлов. Также это не входит в подкаталоги, которые отсутствуют в одном из каталогов. Таким образом, вывод довольно лаконичен, и скрипт работает быстро с большими каталогами.
Если вы сохраните его в файл с именем
compare_dirs.py
, вы можете запустить его с Python3.x:Образец вывода:
PS Если вам нужно сравнить размеры файлов и хэши файлов на предмет возможных изменений, я опубликовал обновленный скрипт здесь: https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779
источник
cmpdirs dir1 dir2 '/\.git/'
Я добавлю в этот список альтернативу NodeJ, которую я написал некоторое время назад.
реж-сравнить
источник
Я хотел бы предложить отличный инструмент, который я только что открыл: MELD .
Он работает должным образом, и все, что вы можете сделать с помощью команды в системе
diff
на основе Linux, может быть воспроизведено с хорошим графическим интерфейсом! наслаждатьсяисточник