使用Find和SCP维护目录结构

我正在使用find命令来查找需要scp到目标主机的文件。 我的问题是目录结构没有维护在目标上。

cd /path/to/dir; find . -exec scp -pr {} hostname:/tmp/. \;

(我已经尝试过,并与-r 。)

如果find yield ./subdir/file ,我想将它复制到hostname:/tmp/subdir/file

哦,并且在build议之前,远程主机已禁用rsync

你可以用两个单独的命令来做到这一点。 首先,您需要在每个文件所在的远程服务器上创建目录

 find . -type f -printf "%h\n" | sort | uniq | xargs -i ssh hostname mkdir -p /tmp/{} 

然后你可以像以前一样复制每个文件

 find . -type f -exec scp {} hostname:/tmp/{} \; 

你需要比找到更复杂的东西:

 #!/bin/bash remote=user@host:/path/to/dest/ for file in $(find . -type f); do echo scp $file ${remote}$(echo $file | sed 's:^\.*/::') done 

而且你总是可以把它凝结成:

 for file in $(find . -type f); do echo scp $file user@host:/path/to/dest/$(echo $file | sed 's:^\.*/::'); done 

当你确定它会按照你的预期运行时,只要删除echo

随机的例子输出:

 scp ./cron/test.txt user@host:/path/to/dest/cron/test.txt scp ./cron/spamproc/rfc822_addresses.php user@host:/path/to/dest/cron/spamproc/rfc822_addresses.php scp ./cron/spamproc/mime_parser.php user@host:/path/to/dest/cron/spamproc/mime_parser.php scp ./cron/spamproc/spamproc.php user@host:/path/to/dest/cron/spamproc/spamproc.php scp ./cron/spamproc/class.imap.php user@host:/path/to/dest/cron/spamproc/class.imap.php scp ./count_imap.sh user@host:/path/to/dest/count_imap.sh