【问题标题】:Maintain Directory Structure with Find and SCP使用 Find 和 SCP 维护目录结构
【发布时间】:2013-09-11 01:43:07
【问题描述】:

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

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

(我已经用 -r 尝试过这个。)

如果find 产生./subdir/file,我希望将其复制到hostname:/tmp/subdir/file

哦,在建议之前,远程主机已禁用rsync

【问题讨论】:

  • 我假设您传递给find 的选项比您在问题中显示的要多,因为您可以用scp -pr /path/to/dir hostname:/tmp/. 替换整个命令
  • 抱歉,是的,我正在使用find 来查找非常具体的文件。我不认为我的模式只会使示例复杂化。
  • 如果你有足够的磁盘空间,你可以使用tar 然后scp tarball 到远程主机然后解压。

标签: linux bash find scp


【解决方案1】:

您可以使用两个单独的命令来执行此操作。首先,您需要在远程服务器上创建每个文件所在的目录

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

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

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

【讨论】:

  • 这看起来应该是最好的。谢谢。这样一个简单的问题,但它让我很适应。额外的视角会有所帮助。
【解决方案2】:

您需要比查找更复杂的东西:

#!/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

【讨论】:

  • scp /path/to/file host:/path/to/file 如果目录/path/to 不存在于host 上,则会失败。
  • @ThisSuitIsBlackNot Hrmm...好吧,除非你想重写 rsync 的大部分内容,否则我建议在目标服务器上打开 rsync。
  • 谢谢,如果事先创建了目录结构,则可以对其进行修改以使其正常工作。不幸的是,我不维护远程端。有很多原因,Rsync 会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
相关资源
最近更新 更多