1

У меня есть две директории, которые я хотел бы сравнить. Первый каталог содержит резервную копию rsync многих тысяч папок и файлов. Второй каталог содержит жесткие ссылки на все файлы в первом, плюс несколько дополнительных папок и файлов. Я хотел бы иметь возможность сравнивать каталоги таким образом, чтобы файлы с жесткими ссылками были пропущены или, по крайней мере, быстро решили, что это тот же файл, и только те файлы, которые не являются жесткими ссылками, будут дополнительно сравниваться. Это может сделать diff, или есть лучший способ?

2 ответа2

1

cmpdir для этой проблемы (отказ от ответственности - я написал это).

Сравнивает только иноды. Файлы, которые существуют только в первом каталоге, помечаются как "Удаленные", тогда как файлы, которые существуют только во втором каталоге, как "Новые". Это не сравнивает содержимое файла, хотя.

0
  1. Вы можете показать inode ваших файлов с помощью ls -i -1 (-1 / "one" записывает одну строку на файл для вывода).

  2. Сохраните вывод для каждой из двух папок.

  3. Если имя файла "оригинала" и файла с жесткими ссылками различается, используйте команду cut -f1 чтобы отфильтровать имена файлов и сохранить только номера инодов.

  4. Сортируйте файлы по номеру индекса, используя sort . Теперь вы можете использовать diff для просмотра различий.

  5. Использование grep "^<" diffOutput.list для фильтрации строк , начиная с < Inodes происходит только в первой папке. grep "^>" аналогично папке B. Используйте cut -c2- чтобы удалить первый символ (< или >) из выходных данных, если вам нужен номер индекса.


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

Сохраните вывод ls -l -1 (с именами файлов) для каждой папки в один файл. Теперь вы можете использовать grep чтобы получить имена файлов для заданных номеров инодов в цикле bash:

Пусть InodesFilenamesA.list будет файлом, содержащим номера инодов и имена файлов для папки A

12345 file1inBothFolders
99999 file2OnlyInFolderA
88888 file3OnlyInFolderA
...

Пусть inodesA.list будет файлом, содержащим Inodes, встречающиеся только в папке A

99999
88888
....

Теперь inodesA.list .

cat inodesA.list | while read line; do
    grep "$line" InodesFilenamesA.list
done

Вы получаете список папок

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .