使用 find 命令的结果作为 scp 中的输入将远程服务器备份到我的本地计算机

使用 find 命令的结果作为 scp 中的输入将远程服务器备份到我的本地计算机

/var/lib/jenkins/jobs我在远程计算机上有 jenkins,管道脚本以 .xml 格式文件保存在路径中。我可以使用以下命令轻松列出该文件夹中的 .xml 文件:

find /var/lib/jenkins/jobs -name config.xml

结果是:

/var/lib/jenkins/jobs/productA/config.xml
/var/lib/jenkins/jobs/productB/config.xml
/var/lib/jenkins/jobs/productC/config.xml
/var/lib/jenkins/jobs/productD/config.xml
/var/lib/jenkins/jobs/productE/config.xml

从我的本地计算机,我已经设法在远程计算机中制作文件夹的递归副本(远程文件到本地计算机):

scp -r [email protected]:/var/lib/jenkins/jobs/ /mnt/c/backupJenkins/

我想做的是找到我在问题开头描述的内容,以用作scp.

论坛上已经有人提出了一个非常相似的问题,但是它在本地机器上使用find命令传输到远程:

scp --exec=`find <path> -name <expression>` user@host:<path_where_to_copy>

这里我已经根据我的互联网研究进行了一些尝试,我也进行了调整,但它们没有奏效:

scp [email protected]:$`find /var/lib/jenkins/jobs -name config.xml` /mnt/c/backupJenkins
for f in `find /var/lib/jenkins/jobs -name config.xml` ; do 
scp [email protected]/$f /mnt/c/backupJenkins
done

scp 命令如下所示:

scp [other options] [source username@IP]:/[directory and file name] [destination username@IP]:/[destination directory]

在“其他选项”中,我认为传递参数-p甚至可以维护文件夹结构

答案1

我无法使用单个命令进行工作,但使用两个命令就可以了

命令A:ssh [email protected] 'cd /var/lib/jenkins/jobs; find . -name config.xml ! -path '*/backup*' | rsync -avz --files-from=- . ./backup'

'cd /var/lib/jenkins/jobs;- 在远程计算机上使用 ssh 后,我将目录更改为 /var/lib/jenkins/jobs

find . -name config.xml ! -path '*/backup*'- 然后查找并排除文件夹“/backup”的路径,这可以防止 rsync 递归复制“backup”文件夹。

rsync --files-from=- SRC/ DST/使用 rsync 命令的这种格式,我们添加参数-avz--files-from=-

| rsync -avz --files-from=- . ./backup'- 这里的单破折号 - 文件名表示 STDIN,这是 UNIX 工具中的常见约定

命令 B 我们只是使用 rsync 通过 SSH 将文件从远程服务器复制到本地服务器,并保存在本地计算机上的新文件夹 DAY-MONTH-YEAR 上 ( /mnt/c/backupJenkins/$(/bin/date +%d-%m-%Y) )

命令B:rsync -avz [email protected]:/var/lib/jenkins/jobs/backup/* /mnt/c/backupJenkins/$(/bin/date +%d-%m-%Y)

相关内容