请关注本头条号,每天坚持更新原创干货技术文章。
如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习
1. 前言
本文主要讲解如何在scp复制文件时排除指定文件。
举例:
我需要将所有*.c文件从名为hostA的电脑复制到hostB,包括所有目录。我使用以下scp命令,但不知道如何排除特定的文件(如*.out):
scp -r ~/projects/ user@hostB:/home/123/
如何告诉scp命令在Linux/Unix复制文件时排除指定的文件或目录呢?
可以使用scp命令在网络上的主机之间安全地复制文件。它使用ssh进行数据传输和身份验证。典型的scp命令语法如下:
scp file1 user@host:/path/to/test/scp -r /path/to/source/ user@host:/path/to/test/scp [options] /dir/to/source/ user@host:/dir/to/test/
2. scp复制文件时排除指定文件
我不认为您可以在使用scp命令复制文件时可以过滤或排除文件。但是,有一个很好的解决方案可以排除文件并使用ssh安全地复制它。本教程解释如何在使用scp递归复制目录时过滤或排除指定文件。
如何使用rsync命令排除文件
它的语法是:
rsync -av -e ssh --exclude='*.out' /path/to/source/ user@hostB:/path/to/test/
解释一下上面的命令:
-a : 递归到目录,即复制所有文件和子目录。此外,打开存档模式和所有其他选项 (-rlptgoD)
-v : 详细输出
-e ssh : 使用ssh作为远程shell,以便对所有内容进行加密
--exclude='.out' : 排除匹配模式的文件,例如。out或*.c等等.
rsync命令的例子
在本例中,从~/virt/目录递归复制所有文件,但排除所有*.新文件:
rsync -av -e ssh --exclude='*.new' ~/virt/ root@centos7:/tmp
如果在远程服务器上没有找到Rsync,则Rsync命令将失败。在这种情况下,尝试下面的scp命令,它在当前目录中使用bash shell模式匹配(它不会与-r选项一起工作):
ls
输出结果:
access.log-20190218 access.log-20190727 logip.new
复制当前目录中除.new文件外的所有内容:
shopt -s extglobscp !(*.new) root@centos7:/tmp/
输出结果:
access.log-20190218 100% 4262 1.3MB/s 00:00
access.log-20190727 100% 836MB 32.7MB/s 00:25
3. 理解extglob shell选项来排除使用scp和rsync的文件
如果使用shopt命令(build tin)启用extglob bash shell选项,Linux系统可以识别几个扩展的模式匹配操作符,如下所示:
OperatorsDescription?(pattern-list)匹配给定模式的零次或一次出现*(pattern-list)匹配给定模式的零次或多次出现+(pattern-list)匹配给定模式的一个或多个匹配项@(pattern-list)匹配给定的模式之一!(pattern-list)匹配除给定模式之一之外的任何内容
4. 总结
本教程向您展示了如何在Linux或类unix操作系统下的网络上的主机之间使用scp或者rsync命令复制文件时排除指定的文件。有关更多信息,请参阅以下手册页:
man 1 rsyncman bashman 1 scp