从 Windows samba 共享复制到 Linux 文件系统的文件不保留修改日期元数据

从 Windows samba 共享复制到 Linux 文件系统的文件不保留修改日期元数据

fstab我使用终端将整个照片库从安装在的 Windows Samba 共享复制到我的 Ubuntu Linux 机器上的本地目录中。

cp /sambashare/photos /localdisk/photos

遗憾的是,这会将我所有照片的修改日期字段重置为当前日期。我再次测试了这一点,并将一些照片从 Windows Samba 共享复制到了同一台装有 Windows 文件资源管理器的 Linux 机器上(我只是在 Linux 系统上创建了第二个 Samba 共享)。我注意到这种方法保留了所有修改日期元數。

因此,问题肯定是 Linux 命令cp在从 Samba 共享复制文件时甚至没有尝试保留修改日期数据。不幸的是,我的原始照片库不可用,所以现在我所有的照片都缺少修改日期数据。

我的第一个问题是,有什么方法可以恢复这些数据吗?也许它仍然位于文件中,但 Linux 无法正确显示它?

我的第二个问题或未来的参考是,在这些情况下,有什么方法可以让 cp 命令保留这些元数据?

谢谢

答案1

因此,问题肯定是 Linux 命令 cp 在从 Samba 共享复制文件时甚至没有尝试保留修改日期数据。

不,问题是 Linux 命令cp不会尝试保留修改时间一般来说。您始终必须使用-p选项(或-a)来实现这一点,无论源或目标是什么。

有什么方法可以恢复这些数据吗?也许它仍然位于文件中,但 Linux 无法正确显示它?

未找到修改时间文件,它是一个“外部”属性,需要单独调用来查找和更改。如果没有明确复制,则不会复制。

(Linux SMB 客户端可能存在与在程序更改时间戳后不刷新时间戳相关的错误,但这种情况不太可能发生。如果是这种情况,则时间戳仍可通过 Windows 或重新挂载后看到。)

然而,你经常文件中包含一堆 EXIF 照片时间戳,例如“拍摄照片的日期”(由相机设置),这些时间戳总是会被复制,因为它是文件内容的一部分。有一些脚本可以从 EXIF 元数据中分配修改日期的时间戳。

除此之外,您还可以根据您的相册名称和/或您自己的记忆仅设置粗略的仅限日期的时间戳(例如,如果您记得特定照片是 2003 年 2 月拍摄的,则可以将touch它们设置为 2003-02-09 00:00:00)。

在这些情况下,有什么方法可以让 cp 命令保留这些元数据?

使用-p选项(或-a在适当的时候)。

答案2

我认为更合适的工具是带有 -av 开关的 rsync。

要查看有哪些“元数据”可用:您可以在图像上放置类似 exiftool 的东西。

这或许是对你关于备份的及时提醒。(为什么你的原始数据“不可用”)

答案3

最后,我不得不编写几个 Python 脚本来解决这个问题。你可以找到它这里在 GitHub 上,readme 文件还进一步解释了我如何修复该问题。感谢您的帮助。

相关内容