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复制文件时排除指定文件

7ec1095b17e45bf61eec7ab043534bc7.png

我不认为您可以在使用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

a5d498eeb7c26f77f009168558bed686.png

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

ls

输出结果:

access.log-20190218 access.log-20190727 logip.new

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

shopt -s extglob

scp !(*.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系统可以识别几个扩展的模式匹配操作符,如下所示:

Operators

Description

?(pattern-list)

匹配给定模式的零次或一次出现

*(pattern-list)

匹配给定模式的零次或多次出现

+(pattern-list)

匹配给定模式的一个或多个匹配项

@(pattern-list)

匹配给定的模式之一

!(pattern-list)

匹配除给定模式之一之外的任何内容

4efe71a5da8b56d977f6e1f311be6ee0.png

4. 总结

本教程向您展示了如何在Linux或类unix操作系统下的网络上的主机之间使用scp或者rsync命令复制文件时排除指定的文件。有关更多信息,请参阅以下手册页:

man 1 rsync

man bash

man 1 scp

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐