У меня есть две директории, которые я хотел бы сравнить. Первый каталог содержит резервную копию 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
Вы получаете список папок