我有一个半工作rsync
命令,我将其与find
Linux 机器上的命令结合起来,以执行特定类型和日期的简单文件传输。
这是命令:
rsync -avx --timeout=30 --ignore-existing admin@host:'`find /results/analysis/ -mtime -1 -type f -iname "*.xq"`' /home/serverdir/
问题是这样的:
如果找到任何文件,上述命令将完美运行。当没有找到文件时它会中断,并且由于某种原因实际上发送了位于远程计算机主目录上的文件,顺便说一句,该文件比 -mtime 指示的 1 天早得多。
错误信息:
receiving incremental file list
./
rsync: send_files failed to open "/home/admin/.viminfo": Permission denied (13)
file.txt
就好像当find
命令没有报告任何内容时,rsync 只是默认发送主目录中的所有内容。关于如何解决这个问题有什么想法吗?
答案1
由于您似乎想要复制的只是文件,因此您可以直接执行此操作,而不是混合find
和。我已经包含了该标志,以便您可以安全地测试它,而不会影响任何更改;准备好后,只需将其从命令行中删除即可。rsync
*.xq
rsync
--dry-run
rsync --dry-run -av --include '**/' --include '*.xq' --exclude '*' admin@host:/results/analysis/ /home/serverdir/
--include
和的混合--exclude
按从左到右的顺序解释如下:
--include '**/'
包括所有目录(但不包括文件)--include '*.xq'
包含与 glob 匹配的所有文件(或目录)*.xq
--exclude '*'
排除所有未提及的内容
答案2
您观察到的正是正在发生的情况:只是HOST:
没有显式路径,则要求复制整个默认目录(通常是主目录):
Note also that host and module references don’t require a trailing
slash to copy the contents of the default directory. For example, both
of these copy the remote directory’s contents into "/dest":
rsync -av host: /dest
rsync -av host::module /dest
我建议要么完全避免使用find
(如果可能的话)(请记住,rsync 将为已传输的文件使用可忽略不计的带宽),或者分两步执行此操作(首先find
,然后rsync
在其输出上)。
更准确地说,类似以下内容应该可以工作(为了简洁起见,我省略了一些 rsync 选项):
ssh user@host find source-dir -mtime -1 -type f -printf %p\\\\0 \
| rsync --from0 --files-from=- user@host:. dest-dir/
您在评论中提到的主要变化是:该find
命令在远程主机上运行,而不是在本地运行。