У меня есть две директории, которые я хотел бы сравнить. Первый каталог содержит резервную копию rsync многих тысяч папок и файлов. Второй каталог содержит жесткие ссылки на все файлы в первом, плюс несколько дополнительных папок и файлов. Я хотел бы иметь возможность сравнивать каталоги таким образом, чтобы файлы с жесткими ссылками были пропущены или, по крайней мере, быстро решили, что это тот же файл, и только те файлы, которые не являются жесткими ссылками, будут дополнительно сравниваться. Это может сделать diff, или есть лучший способ?
2 ответа
Вы можете показать inode ваших файлов с помощью
ls -i -1(-1 / "one" записывает одну строку на файл для вывода).Сохраните вывод для каждой из двух папок.
Если имя файла "оригинала" и файла с жесткими ссылками различается, используйте команду
cut -f1чтобы отфильтровать имена файлов и сохранить только номера инодов.Сортируйте файлы по номеру индекса, используя
sort. Теперь вы можете использоватьdiffдля просмотра различий.Использование
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
Вы получаете список папок
