Rsync“查找”隐式排除的文件

Rsync“查找”隐式排除的文件

我有一个半工作rsync命令,我将其与findLinux 机器上的命令结合起来,以执行特定类型和日期的简单文件传输。

这是命令:

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*.xqrsync--dry-run

rsync --dry-run -av --include '**/' --include '*.xq' --exclude '*' admin@host:/results/analysis/ /home/serverdir/

--include和的混合--exclude按从左到右的顺序解释如下:

  1. --include '**/'包括所有目录(但不包括文件)
  2. --include '*.xq'包含与 glob 匹配的所有文件(或目录)*.xq
  3. --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命令在远程主机上运行,​​而不是在本地运行。

相关内容