我正在尝试将文件从系统 A 同步到系统 B。但是,文件在另一个目录结构中重新组织,这使得 rsync 的使用变得困难。
有没有办法告诉 rsync 忽略目录并仅对文件名进行操作?文件名是唯一的 - 目录不是。目录结构不是固定的,所以我不能简单地替换它们。我已经考虑过编写一个删除目录信息的脚本,但我不确定这是否会带来其他问题。
事实上,是的,我希望扁平化目录结构。根据答案,rsync 可能不是我想要使用的。
我正在处理视频,第三方创建目录结构(并且应该允许他们在适当的时候更改目录结构)。这些视频需要同步到主文件系统。文件名同意不更改。因此,在两个系统上“find . | rip-out-path”之间的差异和差异可能会起作用;但我想知道 rsync 是否有一些神奇的标志可以在递归时完全忽略目录 - 类似于 patch 中的 -p 参数。
答案1
解决将所有文件从目录树直接移动到单个目录树的最简单方法可能是使用 find 和 -type 和 -exec 选项。-type 选项将输出限制为特定类型的目录条目(f 表示文件,d 表示目录等)。-exec 选项将找到的名称(作为 {})传递给带有选项的命令行。
以下是几个示例:
find /directory/top/ -type f -exec rsync {} desthost:/destdir
find /directory/top/ -type f -exec scp {} desthost:/destdir
答案2
你完蛋了,或者说没完没了。虽然你可以告诉rsync
它递归和各种其他游戏,但你不能告诉它在文件系统树中四处寻找在另一端名为相同的文件。
我想说的是,你要做的是在远端有一个小包装脚本,给定一个裸文件,返回该端文件的完整路径,然后在本地端遍历每个文件,调用这个包装脚本来获取远程路径,然后一次执行rsync
一个...文件...
当然,这是假设所有文件都已经存在于远端……如果它们根本不存在,它们会被放在哪里?它们会被跳过吗?
我会找到想出这个疯狂文件存储方案的人并打断他的手指。
答案3
在一般情况下,我仍然坚持我的“手指折断”的其他答案,但对于你的具体情况,我有一个不同的解决方案,据我了解:
- 其他人都有他们自己的副本,无论他们选择什么古怪的等级制度;
- 你需要他们的所有文件,但要按照你自己的古怪层次结构进行组织
我的想法是,你对每个要同步的远程文件系统运行一个 rsync 到远程特定目录(比如/storage/.remotes/client1/
,/storage/.remotes/client2/
等等),然后有一个脚本将文件名规范化到你自己的层次结构中(假设你可以用算法描述你的组织方案),然后在 rsync 完成它的操作后,对所有内容运行该脚本符号链接到客户端特定的远程存储位置。如果您无法用算法描述所需的层次结构,那么我猜您必须手动进行符号链接(或者至少需要一定程度的人工输入,即使有工具支持)。
唯一的困难是如果远程重新排列它们的内容,但那时你只需检测现在已损坏的符号链接,找到文件名的新位置(假设名称没有改变,只是位置改变了)。
答案4
您可以使用命令将文件从各个源文件夹复制到一个目标文件夹(平面),而无需传输源子文件夹:
find source_dir -name "*.pdf" >/tmp/xx.txt
rsync -t -v --no-relative --files-from=/tmp/xx.txt / desthost:/destdir
rm -f /tmp/xx.txt