使用scp递归复制dir时如何过滤文件?

时间:2009-08-04 16:15:39

标签: file shell filter directory scp

我需要将所有.class文件从服务器复制到本地并保留所有目录。例如server:/usr/some/unknown/number/of/sub/folders/me.class问题是/usr/project/backup/some/unknown/number/of/sub/folders/me.class,还有许多其他无用的文件,例如我不想要的.svn-base文件。我怎样才能过滤它们,所以我只有scp .class文件?

9 个答案:

答案 0 :(得分:138)

由于其rsyncinclude标志,我可能会建议使用exclude之类的内容,例如: -

rsync -rav -e ssh --include '*/' --include='*.class' --exclude='*' \
server:/usr/some/unknown/number/of/sub/folders/ \ 
/usr/project/backup/some/unknown/number/of/sub/folders/

其他一些有用的标志:

  • -r for recursive
  • -a用于存档(主要是所有文件)
  • -v表示详细输出
  • -e指定ssh而不是默认值(实际应该是ssh)

答案 1 :(得分:64)

要在基目录中排除dotfiles:

scp -r [!.]* server:/path/to/something

[!.]*是一个shell glob,它扩展到工作目录中不以点开头的所有文件。

答案 2 :(得分:34)

scp中没有过滤文件的功能。对于像这样的“高级”东西,我建议使用rsync:

rsync -av --exclude '*.svn' user@server:/my/dir .

(此行将rsync从远程文件夹复制到当前文件夹)

默认情况下,rsync连接的最新版本会自动通过ssh连接。

答案 3 :(得分:8)

由于scp ssh你可以# After reaching the server of interest cd /usr/some/unknown/number/of/sub/folders tar cfj pack.tar.bz2 $(find . -type f -name *.class) , 编写以下脚本或登录并执行...

scp

返回(注销)到本地服务器和# from the local machine cd /usr/project/backup/some/unknown/number/of/sub/folders scp you@server:/usr/some/unknown/number/of/sub/folders/pack.tar.bz2 . tar xfj pack.tar.bz2

$(find ...)

如果您发现find . -type f -name *.class | xargs tar cfj pack.tar.bz2 太长而无法更改tar,

/usr/project/backup/

最后,因为你将它保留在tar.bz2
为什么要麻烦提取?只需保留{{1}},可能还有日期+时间戳。

答案 4 :(得分:1)

启用基于ssh密钥的身份验证后,以下脚本将起作用。

for x in `ssh user@remotehost 'find /usr/some -type f -name *.class'`; do y=$(echo $x|sed 's/.[^/]*$//'|sed "s/^\/usr//"); mkdir -p /usr/project/backup$y; scp $(echo 'user@remotehost:'$x) /usr/project/backup$y/; done

答案 5 :(得分:1)

下面是文件命令。

scp`找到。 -maxdepth 1 -name“* .log”\! -name“hs_err_pid2801.log”-type f` root @ IP:/ tmp / test /

  1. IP将是目标服务器IP地址。
  2. -name“* .log”包含文件。
  3. \! -name“hs_err_pid2801.log”表示排除文件。
  4. 。是当前的工作目录。
  5. -type f表示文件类型。
  6. 目录下的命令。

    scp -r`find。 -maxdepth 1 -name“lo *”\! -name“localhost”-type d` root @ IP:/ tmp / test /

    您可以根据自己的要求自定义上述命令。

答案 6 :(得分:1)

如果你确实想使用scp,那就是间接的方式。我们想将本地文件夹'/ src'下的所有.jpg文件复制到远程服务器10.1.1.2中的文件夹'/ dst' :

#make a clean temp folder
mkdir /tmp/ttt
#copy all .jpg file and retain folder structure as-is
find /src -type f -name *.jpg -exec cp --parents \{\} /tmp/ttt \;
#copy to remote target folder as-is and retain original time attributes
scp -rp /tmp/ttt/* 10.1.1.2:/dst
#if copy ok, remove temp folder
rm -rf /tmp/ttt

答案 7 :(得分:0)

scp -i /home/<user>/.ssh/id_rsa -o "StrictHostKeyChecking=no" -rp /source/directory/path/[!.]* <target_user>@<target_system:/destination/directory/path

答案 8 :(得分:-1)

  1. 将源文件夹复制到somedir

    cp -r srcdir somedir

  2. 删除所有不需要的文件:

    找到somedir -name'.svn'-exec rm -rf {} \ +

  3. somedir

  4. 启动scp