107

我需要将所有 .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 文件?

4

9 回答 9

165

rsync由于它的includeexclude标志,我可能会建议使用类似的东西,例如:-

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对于递归
  • -a用于存档(主要是所有文件)
  • -v用于详细输出
  • -e指定 ssh 而不是默认值(实际上应该是 ssh)
于 2009-08-04T16:27:15.957 回答
84

排除基目录中的点文件:

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

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

于 2015-02-12T14:10:36.493 回答
43

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

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

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

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

于 2009-08-04T16:25:20.297 回答
11

既然可以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 ...)tar 更改时间太长,

find . -type f -name *.class | xargs tar cfj pack.tar.bz2

最后,既然你把它保存在/usr/project/backup/
为什么还要提取呢?只需保留tar.bz2, 可能带有日期+时间戳。

于 2009-08-04T17:07:46.233 回答
2

以下命令用于文件。

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 用于文件类型。

下面的目录命令。

scp -r`查找。-maxdepth 1 -name "lo*" \! -name "localhost" -type d` root@IP:/tmp/test/

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

于 2017-11-29T11:37:32.180 回答
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
于 2018-03-22T12:56:11.980 回答
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
于 2016-01-04T11:23:06.023 回答
0
scp -i /home/<user>/.ssh/id_rsa -o "StrictHostKeyChecking=no" -rp /source/directory/path/[!.]* <target_user>@<target_system:/destination/directory/path
于 2020-02-03T16:38:34.803 回答
-3
  1. 将您的源文件夹复制到somedir

    cp -rsrcdir somedir

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

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

  3. 启动 scp 从somedir

于 2009-08-04T16:21:11.383 回答