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

der*_*dji 95 directory shell scp file filter

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

Gav*_*our 144

我可能会建议使用类似的东西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/
Run Code Online (Sandbox Code Playgroud)

其他一些有用的标志:

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

  • 无论如何要忽略其中没有*类文件的子文件夹?(即我不想要一堆空的dirs) (4认同)
  • 你能解释一下--include,not --include =在MAN页面中,我可以找到--include =但不是--include的解释 (2认同)
  • 根据 rsync 手册页,选项 `-a` 已经包含了 `-r`。 (2认同)
  • @GrantBirchmeier`--prune-empty-dirs`将删除空目录。 (2认同)

rgt*_*gtk 71

要在基目录中排除dotfiles:

scp -r [!.]* server:/path/to/something
Run Code Online (Sandbox Code Playgroud)

  • 这可能是最好的答案; 使用globs过滤文件是要走的路. (9认同)
  • 对于 zsh:`scp -r [\!.]* 服务器:/path/to/something` (8认同)
  • 这表明要排除被询问的文件,但是如何在整个目录中实现呢? (2认同)

Vil*_*ari 35

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

rsync -av --exclude '*.svn' user@server:/my/dir .
Run Code Online (Sandbox Code Playgroud)

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

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


nik*_*nik 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)
Run Code Online (Sandbox Code Playgroud)

返回(注销)到本地服务器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
Run Code Online (Sandbox Code Playgroud)

如果您发现$(find ...)焦油变化太长,

find . -type f -name *.class | xargs tar cfj pack.tar.bz2
Run Code Online (Sandbox Code Playgroud)

最后,既然你要保留它/usr/project/backup/,
为什么要费心去除?只需保留tar.bz2,可能是日期+时间戳.