我在远程服务器上有一个类似于这样的目录结构,下面列出了一些文件:
/logs/service::A1/20210730T120000/log.log
/logs/service::A1/20210729T120000/log.log
/logs/service::A2/20210730T120000/log.log
/logs/service::B0/20210730T120000/log.log为了rsync serviceA中的所有文件,我只使用一个通配符*运行以下命令
rsync -av <remote-server>:/logs/service::A* <destination>
这和预期的一样工作,我在目的地得到了以下目录结构:
<destination>/service::A1/20210730T120000/log.log
<destination>/service::A1/20210729T120000/log.log
<destination>/service::A2/20210730T120000/log.log但是,如果我想从某一天rsync serviceA中的所有文件,我需要第二个通配符,如:rsync -arv <remote-server>:/logs/service::A*/20210730* <destination>
但是,这样我就失去了顶级目录,并在目的地给出了以下结构:
<destination>/20210730T120000/log.log
<destination>/20210730T120000/log.log我仍然希望在我的目的地的service::<xx>水平。实现这一目标的方法似乎是通过--include/--exclude标志。
不过,我尝试了这里的方法,但没有找到文件:
rsync -av --include='service::A**/20210730**' --exclude='*' <remote-server>:/logs/ <destination>
receiving incremental file list
./发布于 2021-07-31 06:50:06
您很可能希望使用包含模式/service::A*/20210730*/**和*/以及排除模式*的组合。您还可能希望包含-m (--prune-empty-dirs),以便只创建保存实际传输的文件所需的目录结构。
rsync -avm \
--include='/service::A*/20210730*/**' \
--include='*/' \
--exclude='*' \
remote:/logs/ local-path/logs在传输的文件列表阶段,这将遍历根植于远程主机上的/logs的整个层次结构,包括每个目录(由于*/包含模式)和所有与第一个模式匹配的文件和目录,但不包括任何其他内容。在实际开始传输之前,目录和文件的路径名列表将被删除空目录(“空”表示“不包含与任何包含模式匹配的文件”)。
需要使用*/模式来允许rsync进入匹配的/service::A*等目录,因为否则,由于*排除模式,这是不可能的。
由于上面的解决方案需要对/logs下的所有内容进行完整遍历,如果您有巨大的文件层次结构,这可能会很慢。
如果是这样的话,您可以通过对包含模式进行更多的选择来加快速度:
rsync -avm \
--include='/service::A*/' \
--include='/service::A*/20210730*/***' \
--exclude='*' \
remote:/logs/ local-path/logs这显式地允许rsync输入与/service::A*/匹配的目录。然后,它包含我们感兴趣的所有时间戳目录,而不包括其他所有内容。
像dir/***这样的模式不同于dir/**,因为前者还包括dir目录本身。
https://unix.stackexchange.com/questions/662672
复制相似问题