令人尴尬的是,我在编写 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有一个选项。mtime
ctime
find
-Bmin
-Bnewer
-Btime
ls
-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 中使用的名称;它是问题中使用的名称。☺
进一步阅读
- 戴维·豪威尔斯(2010-07-15)。 [补丁 08/18] xstat:CIFS:返回扩展属性 [ver #6]. Linux 内核邮件列表。
- 2.4.7 文件基本信息. Windows SMB 协议。MSDN。微软公司。
- 查找(1) 手册页. FreeBSD 手册页。
- stat(2) 手册页. FreeBSD 手册页。
- ls(1) 手册页. Darwin 手册页。 Apple 公司。
- Corinna Vinschen(2007-03-26)。_回复:支持 st_birthtime_. Cygwin 邮件列表。
- Linus Torvalds(2010-07-22)。回复:[补丁 02/18] xstat:添加一对系统调用以使扩展文件统计信息可用 [ver #6]. Linux 内核邮件列表。
- A.3.1.3 文件头. 文件-11. OpenVMS 系统文档。HP。