linux - 在 Linux 中检测文件移动或重命名的最佳方法?

标签 linux file inode

某些解决方案可能适用于 Windows,但我不熟悉 Windows 操作系统,因此这将以 Linux 为重点。

据我了解,Unix文件系统都有inode的概念,inode就是存放文件系统元数据和"file"的地方。因此,我想知道是否可以使用 inode 编号和一些附加信息来跟踪重命名或移动的文件?

我打算做的是进行初始扫描,创建一个数据库,其中包含文件名/路径、文件所在的磁盘/驱动器、inode 编号,最后是某种校验和 (sha-1)。

这将使系统能够使用 inode 编号快速检测文件是否被移动或重命名,然后它会跟进校验和以检查它是否实际上是同一个文件。

我可以看到这个方案可能存在的一些问题:

  1. 文件可以被修改然后移动/重命名,这将无法检测到它,因为校验和不匹配。
  2. 一些(大多数?)应用程序在修改文件时会创建一个新的临时文件,然后将其与当前文件切换,因此即使文件最终未修改,inode 也不会匹配....
  3. 需要存储它所在的设备/文件系统,因为每个文件系统上的 inode 对于该文件系统都是唯一的。
  4. 需要处理硬链接(hard link)

我想知道是否还有其他我忘记的陷阱?我希望能够使用 inode 快速追踪哪些文件被移动或重命名,然后用校验和跟进以确认它实际上是同一个文件。

最佳答案

查看 inotify,它允许您在有人对指定文件系统或目录中的文件执行任何操作时接到电话。

关于linux - 在 Linux 中检测文件移动或重命名的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3514771/

相关文章:

java - 在 Java 中读取包含 JSON 数据的文本文件

c - 为什么 inode 编号从 1 而不是 0 开始?

c++ - 是否有一个 (Linux) C++ IDE 可以 'construct' 来自 makefile 的项目?

linux - ' : not a valid identifier Read and Curl

java - 我如何保证我的文件尾随 Linux 缓存中的最新缓冲区

c++ - std::endl 和 '\n' 有什么区别

C++ - 如何获取特定用户的桌面路径

windows - 如何在不阻止其重命名的情况下在 Windows 中打开文件

apache - (Apache) 将 inode 放入 ETag 的目的是什么?

linux - 如何创建 64 位 inode?