Linux 中真的没有办法获取 cifs/smb 共享上的文件的创建时间吗?

Linux 中真的没有办法获取 cifs/smb 共享上的文件的创建时间吗?

令人尴尬的是,我在编写 bash 备份脚本时已经走了很远,却错过了一些重要的东西。我知道 ext3 文件系统不跟踪创建日期,但在 ext3 中复制文件会更新通过 stat 看到的更改时间(这可以工作)。但是,当文件从一台 Windows 服务器复制到另一台(我通过 smb/cifs 安装该服务器)时,根据我的测试,更改时间没有更新。我使用 find 在 cifs 共享上进行搜索。真的没有办法使用“find”从 Linux 检测何时通过 cifs 共享创建新文件吗?

此外,我非常熟悉 rsync,在这种情况下,rsync 的局限性使它无法成为一种选择。我原本想使用 rsync 进行搜索,并尝试将结果通过管道传输到操作 (gzip),但我认为子 shell 很荒谬。当然,这可能是错的。任何建议都将不胜感激。可以提供更多细节,但从我的研究来看,我认为这是不可能的。

答案1

Linux 内核已经xstat(2)开发系统调用好几年了。RedHat 的 David Howells 做了大量工作。 xstat(2)允许从支持它的几个文件系统中检索文件的创建时间(有时在 Linux 和 BSD 世界中被重新命名为“出生时间”或“出生时间”,这没什么特别的)。这些文件系统包括 EXT4(磁盘上有创建时间戳)和 CIFS(它继承了 DOS/OS/2/Windows 的传统,几十年来一直将创建时间戳作为头等公民)。M. Howells 致力于与系统调用配合使用的 CIFS 补丁。

OpenSolaris 和 BSD 现在确实st_birthtim在系统调用中有一个 datum stat(2),脚本编写者可以通过诸如find和 之类的应用程序访问该功能ls。在 OpenSolarisls手册页中,您会在多个地方看到crtime、和。同样,FreeBSD命令atime也有、和主键。而 Mac OS有一个选项。mtimectimefind-Bmin-Bnewer-Btimels-U

如果您正在为 OpenSolaris、BSD 或 Mac OS 10 编写脚本,那么现在您就可以继续处理创建时间。事实上,如果您正在为 Windows 编写脚本,您也可以这样做。Cygwin 已支持st_birthtim 自 2007 年起,使得 Win32 的CreationTime时间戳(自 Windows NT 的第一个版本以来就一直存在并且 Windows NT 在 NTFS 和 FAT 卷上都维护该时间戳)可供 Cygwin 工具使用。

然而,在 GNU Linux 世界中情况并非如此。创建时功能尚未实现GNU coreutils'ls或者GNU findutilsfind。事实上,它甚至还不是主流 Linux 内核的一部分。部分问题在于xstat(2)系统调用陷入了困境,因为人们希望保留三个时间戳,而不是像 Windows NT 内核 API 中那样保留四个,然后将ctime其转储为crtime

Linus Torvalds 在 2010 年的回应是“这一切都完全没用,人们甚至无法就名字达成一致”和“让我们等五年吧”。

事实上,我想大多数读者都知道,自 20 世纪 80 年代以来,全世界就广泛认同“创建时间”这个名称,我们已经等待了至少 25 年。它是 OS/2 1.0 中使用的名称;它是 VMS ODS-1 中使用的名称;它是 Windows NT 3.5 中使用的名称;它是 SMB 中使用的名称;它是问题中使用的名称。☺

进一步阅读

答案2

我无法真正回答这个问题,但至少我可以给你一个提示:这本书实施 CIFS:通用 Internet 文件系统Christopher R. Hertel 撰写的这两页非常有趣:

第 1 页第2页

它们似乎表明可以检索您正在寻找的信息。

相关内容