我有两个目录需要比较。第一个目录包含数千个文件夹和文件的 rsync 备份。第二个目录包含第一个目录中所有文件的硬链接,以及一些其他文件夹和文件。我希望能够以这样的方式比较目录:跳过硬链接文件,或者至少快速确定它们是同一个文件,然后仅比较非硬链接的文件。diff 可以做到这一点吗?或者有更好的方法吗?
答案1
命令目录是为了解决这个问题(免责声明--这是我写的)。
它只比较 inode。仅存在于第一个目录中的文件被标记为“已删除”,而仅存在于第二个目录中的文件被标记为“新”。但它不比较文件内容。
答案2
可能不是您完全想表达的意思,但如果您想跳过两个目录中的文件,您可以使用带有选项的 find -links
。
find ./ -links 1
仅显示具有一个硬链接的文件(因此不能出现在两个目录中)。
答案3
ls -i -1
您可以使用(-1 / “one” 将每个文件写入一行以进行输出)显示文件的 inode 。保存两个文件夹各自的输出。
如果“原始”文件的文件名和硬链接文件的文件名不同,则用于
cut -f1
过滤掉文件名并仅保留 inode 编号。使用 按 inode 号对文件进行排序
sort
。现在您可以使用diff
查看差异。用于过滤仅出现在第一个文件夹中的以 => Inode
grep "^<" diffOutput.list
开头的行。与文件夹 B 类似。如果您需要 Inode 编号,则用于从输出中删除第一个字符(或)。<
grep "^>"
cut -c2-
<
>
如果您之前已从文件中删除了文件名,则必须在文件名中搜索给定的 inode 编号。
ls -l -1
将每个文件夹的 (带文件名)输出保存到一个文件中。现在,您可以使用grep
bash 循环获取给定 inode 编号的文件名:
假设InodesFilenamesA.list
文件包含文件夹 A 的 inode 编号和文件名
12345 file1inBothFolders
99999 file2OnlyInFolderA
88888 file3OnlyInFolderA
...
假设inodesA.list
有一个文件,其 Inode 仅出现在文件夹 A 中
99999
88888
....
现在循环inodesA.list
。
cat inodesA.list | while read line; do
grep "$line" InodesFilenamesA.list
done
您将获得文件夹列表