使用 rsync 复制时忽略 Windows 隐藏文件

使用 rsync 复制时忽略 Windows 隐藏文件

我需要在 Windows 计算机和 Linux 计算机之间保持非常大的目录结构(几百 GB)的同步。我使用 rsync 进行复制,因为它会自动忽略未更改的文件,并且在复制已更改的文件(仅复制差异)时效率更高。

我遇到的问题是,Windows 文件系统上运行的某些应用程序喜欢生成各种我不想复制的元数据文件。由于所有这些文件都使用 Windows 文件属性隐藏,我认为简单地指示 rsync 忽略此类文件会非常有帮助。但 rsync 手册页没有提供任何此类选项。

目前,我使用 SMB 挂载 Windows 文件系统。当我使用控制台列出目录中的文件(使用ls -l)时,它会列出所有文件,包括隐藏文件,但当我使用 nautilus 列出文件时,它会识别出一些是隐藏文件,并且只有在启用“显示隐藏文件”时才会向我显示它们。所以我不确定 rsync 是否可以看到 Windows 文件是隐藏的。

任何建议都会非常有用。

答案1

要将 DOS 属性引入 Linux,您需要编辑 smb.conf 文件。

有两种不同的方法来导入 Windows 属性。

第一个选项是设置map hidden = yes,这意味着 Windows 上的隐藏文件将在 Linux 上设置全局执行位。要使此功能正常工作,您还必须至少001在您的 中拥有create mask

另一个选项是设置store dos attributes = yes,这意味着 Windows 属性将存储在 Linux 文件系统中名为 user.DOSATTRIB 的扩展属性中。

rsync无法根据常规或扩展属性过滤文件,但可以排除您以其他方式准备的文件列表。您可以使用该find命令根据 Unix 属性创建此列表。find我拥有的版本似乎不支持扩展属性,但仍然可以使用该-exec选项find获取所有文件的扩展属性并对其进行过滤。

由于find可以过滤普通的 Unix 权限,如果您选择了世界执行位选项,那么find . -perm -001将找到您安装的 Windows 文件系统中的所有隐藏文件。您可以将此列表放在一个文件中,然后使用rsync --exclude-from=FILE这些文件从 rsync 中排除这些文件。

答案2

我不相信 rsync 能够洞察 Windows 文件共享中哪些文件被标记为“隐藏”。这些文件是否还有其他共同点,例如命名格式?您可以使用 --exclude 或 --exclude-from 选项对不复制的文件名进行模式匹配。(--exclude-from=xyz 选项从文件中加载这些例外,而 --exclude 选项在命令行上指定它们。)

答案3

我没有答案给你,但我认为 rsync 不是合适的地方。我要么尝试在 Windows 端的共享选项中查找某些内容,要么尝试在 mount.cifs 选项中查找。

或许可以使用 ACL 扩展来实现,但传统的 unix 权限中没有任何东西可以隐藏文件。只有当文件/目录名称中的第一个字符为句点时,文件才会被隐藏。

相关内容