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

kiw*_*san 6 linux samba mount bash rsync

我在 bash 备份脚本中非常尴尬,并且错过了一些重要的事情。我知道 ext3 文件系统不跟踪创建日期,但是在 ext3 中复制文件会更新通过 stat 看到的更改时间(这会起作用)。但是,当文件从一台 Windows 服务器复制到另一台(我通过 smb/cifs 安装的)时,根据我的测试,更改的时间不会更新。我正在使用 find 对 cifs 共享进行搜索。真的没有办法检测何时使用“查找”从 Linux 通过 cifs 共享创建新文件?

此外,我对 rsync 非常熟悉,在这种情况下,rsync 的限制将其排除在外。我想我可以使用 rsync 进行搜索并尝试将结果通过管道传递给操作 (gzip),但我认为子外壳会很荒谬。当然可能是错的。任何建议将不胜感激。可以提供更多细节,但从我的研究来看,我认为这是不可能的。

Jde*_*eBP 18

xstat(2)几年来,Linux 内核一直在进行系统调用。RedHat 的 David Howells 做了很多工作。 xstat(2)允许从支持它的几个文件系统中检索文件的创建时间(有时在 Linux 和 BSD 世界中重新命名为“出生时间”或“出生时间”,没有很好的理由),包括 EXT4(具有创建时间戳)在光盘上)和 CIFS(凭借其 DOS/OS/2/Windows 传统,几十年来一直支持创建时间戳作为一等公民)。M. Howells 致力于与系统调用一起使用的 CIFS 补丁。

OpenSolaris 和 BSD 现在确实st_birthtim在它们的stat(2)系统调用中有一个数据,脚本编写者可以通过应用程序(如find和)访问该功能ls。在OpenSolarisls手册页,你会发现crtime一起atimemtimectime在好几个地方。类似地,FreeBSD的find命令有-Bmin-Bnewer-Btime初选。Mac OSls有一个-U选项。

如果您正在为 OpenSolaris、BSD 或 Mac OS 10 编写脚本,那么您现在可以继续进行任何您想做的创建时间。事实上,如果您为 Windows 编写代码,您也可以这样做。Cygwinst_birthtim 从 2007 年开始支持,使得 Win32 的CreationTime时间戳(自 Windows NT 的第一个版本以来一直存在并且 Windows NT 在 NTFS 和 FAT 卷上维护)可用于 Cygwin 工具。

然而,在 GNU Linux 世界中情况并非如此。创建时间功能尚未进入GNU coreutils'lsGNU findutils'find。事实上,它甚至还不是主流 Linux 内核的一部分。部分问题是xstat(2)系统调用陷入了一种转移,人们想要保留三个时间戳,而不是像 Windows NT 内核 API 那样有四个时间戳,并转储ctime以将其替换为crtime.

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

事实上,正如我怀疑大多数阅读本文的人会知道的那样,自 1980 年代以来,世界一直广泛认同“创造时间”这个名称,而我们已经等待了至少 25 年。这是 OS/2 1.0 中使用的名称;它是 VMS ODS-1 中使用的名称;它是 Windows NT 3.5 中使用的名称;这是 SMB 中使用的名称;这是问题中使用的名称。☺

进一步阅读