在远程生产服务器上,我有一个包含超过 15 TB 数据的目录。此外,除了 Linux 权限之外,ACL 还大量用于允许部门、用户和守护程序微调访问。
对于我们的 CI/CD 管道和自动化测试,我需要测试这些权限的更改如何影响系统,但在此之前,我需要克隆测试环境中的生产内容。
我显然无法克隆 15 TB 的数据,而且我真的不关心数据,我只关心元数据(文件名、权限、时间戳 - 基本上所有信息都ls -lah
返回。)
通过我的使用方式很容易看出我正在尝试做什么rsync
:
rsync -aAr --include='*/' --exclude='*' [email protected]:/my/directory/ /test/directory/
从目录的角度来看,这正是我所需要的。如果rsync
有一个选项允许复制内容为 0 但文件名和属性完好无损的文件,问题就解决了。 (可以?)
现在,在我对目录运行上述 rsync 命令后,以下是我的处理方法。
ssh [email protected] 'find /my/directory -type f -exec ls -lah {} \;' > my.production.directory.files.txt
这给了我一个本地文件,其中内容包含如下数据行:
-rwxrwxrwx 1 owner group 15K Oct 13 10:07 /my/directory/jobs.txt
它有 9 个字段,我将其传递给 awk 和 bash:
cat my.production.directory.files.txt | awk '{print "touch " $9 " && chown "$3":"$4" "$9}' | bash
我觉得必须有更好的方法。在我通过其他要应用的命令chmod
和原始时间戳过滤该文件之前,是否有更有效的方法来执行此操作? like cp
has with --attributes-only
liketouch
和chown
can do with --reference,除了针对远程文件系统?
注意,答案必须直接在命令行上执行。我无法上传或依赖任何脚本。另外,我知道 getfacl -R 和 setfacl 将恢复权限,但它不会恢复时间戳和非权限相关的文件数据(我知道)。
答案1
这是一个疯狂的想法:如果你使用sshfs
?
使用以下命令在本地挂载远程目录
sshfs
:sshfs remoteuser@remotehost:/my/directory /mountpoint
使用
--attributes-only
选项来cp
重新创建文件结构:cp -a --attributes-only /mountpoint /test/directory
卸载 sshfs 文件系统:
fusermount -u /mountpoint
这不需要在远程主机上安装任何其他软件。