递归使用scp命令时如何排除文件

时间:2020-01-09 10:43:33  来源:igfitidea点击:

如何将所有.c文件从名为hostA的本地便携式计算机复制到包括所有目录的hostB。
我正在使用以下scp命令,但不知道如何排除特定文件:$scp -r~/projects/user @ hostB:/home/delta/projects /
scp命令在Linux/Unix命令行中排除特定文件或者目录?
可以使用scp命令在网络上的主机之间安全地复制文件。
它使用ssh进行数据传输和身份验证。
典型的scp命令语法如下:

scp file1 user@host:/path/to/dest/
scp -r /path/to/source/ user@host:/path/to/dest/
scp [options] /dir/to/source/ user@host:/dir/to/dest/

Scp排除文件语法和替代方法

我不认为您可以在使用scp命令时过滤或者排除文件。
但是,有一个很好的解决方法,可以排除文件并使用ssh安全地复制文件。
本教程说明使用scp递归复制目录时如何过滤或者排除文件。

如何使用rsync命令排除文件

语法为:

rsync -av -e ssh --exclude='*.out' /path/to/source/ user@hostB:/path/to/dest/

其中:

  • -a:递归到目录中,即复制所有文件和子目录。另外,打开存档模式和所有其他选项(-rlptgoD)
  • -v:详细输出
  • -e ssh:对远程shell使用ssh,以便对所有内容进行加密
  • --exclude ='*。out':排除匹配PATTERN的文件,例如*.out或者*.c等。

rsync命令的示例

在此示例中,从~/virt /目录递归复制所有文件,但排除所有.new文件:

$ rsync -av -e ssh --exclude='*.new' ~/virt/ root@centos7:/tmp

scp使用extglob bash选项排除文件

如果在远程服务器上找不到rsync,则rsync命令将失败。
在这种情况下,请尝试使用以下在当前目录中使用bash shell模式匹配的scp命令(它将与-r选项一起使用):

$ ls

输出示例:

centos71.log  centos71.qcow2  centos71.qcow2.new  centos71.v2.qcow2.new meta-data  user-data

复制当前目录中除.new文件之外的所有文件:

$ shopt -s extglob
$ scp !(*.new) root@centos7:/tmp/

输出示例:

centos71.log                                  100% 4262     1.3MB/s   00:00    
centos71.qcow2                                100%  836MB  32.7MB/s   00:25    
meta-data                                     100%   47    18.5KB/s   00:00    
user-data                                     100% 1543   569.7KB/s   00:00

了解extglob shell选项以使用scp和rsync排除文件

如果使用shopt命令(内置)启用了extglobbash shell选项,Linux系统将识别出以下几种扩展模式匹配运算符:

操作员描述
?(pattern-list)匹配零个或者一次出现的给定模式
\ *(pattern-list)匹配给定模式的零次或者多次出现
+(模式列表)匹配给定模式的一次或者多次出现
@(pattern-list)匹配给定的模式之一
!(pattern-list)匹配给定模式之一之外的任何内容