在相同的目录结构中查找具有不同 inode 的文件

在相同的目录结构中查找具有不同 inode 的文件

我们的备份有点问题。我们的设置如下:

  • 我们使用命令创建备份rsync
  • 备份使用选项选项--link-dest,为所有未更改的文件创建带有指向旧备份的硬链接的增量备份。

一切看起来都很好,到目前为止我们检查过的每个文件自上次备份以来都没有发生变化,并且都正确地硬链接(与旧备份中的文件的 inode 编号相同)。

然而,最近两周备份服务器上的存储需求大幅增加。我们怀疑要么是我们的备份过程出了问题,要么是用户在普通服务器上添加(和/或更改)了大量文件。

我们要检查自上次备份以来发生变化的文件(部分);这意味着检查同一目录结构中具有不同 inode(无硬链接)的所有文件。

如何找到这些文件?

(Ubuntu 12.04 LTS)

答案1

我一下子想到了两种方法:

  1. 使用find并限制链接数量

    find -type f -links 1
    

    上述命令将查找所有 inode 仅由单个链接指向的文件。这意味着指向相同 inode 的任何文件都不会被打印。

  2. 列出所有 inode 并仅显示唯一的 inode

    ls -1i | awk '{print $1}' | sort | uniq -u
    

    请注意,以上内容不会打印文件名,只会打印 inode。这是因为 i) 我们需要对 inode 进行排序/唯一化;ii) 文件名可能包含奇怪的字符(例如换行符),这会破坏排序/唯一化。如果您确信文件名是合理的,则可以使用此方法打印文件名:

    ls -1i | awk '{c[$1]++;l[$1]=$0;} END{for(i in c){if(c[i]==1){print l[i]}}}'
    

相关内容