如何快速比较两个目录并跳过 Linux 中两个目录中都存在的硬链接文件

如何快速比较两个目录并跳过 Linux 中两个目录中都存在的硬链接文件

我有两个目录需要比较。第一个目录包含数千个文件夹和文件的 rsync 备份。第二个目录包含第一个目录中所有文件的硬链接,以及一些其他文件夹和文件。我希望能够以这样的方式比较目录:跳过硬链接文件,或者至少快速确定它们是同一个文件,然后仅比较非硬链接的文件。diff 可以做到这一点吗?或者有更好的方法吗?

答案1

命令目录是为了解决这个问题(免责声明--这是我写的)。

它只比较 inode。仅存在于第一个目录中的文件被标记为“已删除”,而仅存在于第二个目录中的文件被标记为“新”。但它不比较文件内容。

答案2

可能不是您完全想表达的意思,但如果您想跳过两个目录中的文件,您可以使用带有选项的 find -links

find ./ -links 1

仅显示具有一个硬链接的文件(因此不能出现在两个目录中)。

答案3

  1. ls -i -1您可以使用(-1 / “one” 将每个文件写入一行以进行输出)显示文件的 inode 。

  2. 保存两个文件夹各自的输出。

  3. 如果“原始”文件的文件名和硬链接文件的文件名不同,则用于cut -f1过滤掉文件名并仅保留 inode 编号。

  4. 使用 按 inode 号对文件进行排序sort。现在您可以使用diff查看差异。

  5. 用于过滤仅出现在第一个文件夹中的以 => Inodegrep "^<" diffOutput.list开头的行。与文件夹 B 类似。如果您需要 Inode 编号,则用于从输出中删除第一个字符(或)。<grep "^>"cut -c2-<>


如果您之前已从文件中删除了文件名,则必须在文件名中搜索给定的 inode 编号。

ls -l -1将每个文件夹的 (带文件名)输出保存到一个文件中。现在,您可以使用grepbash 循环获取给定 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

您将获得文件夹列表

相关内容