How to exclude file when using scp command recursively?

One can use scp command to securely copy files between hosts on a network. It uses ssh for data transfer and authentication purpose. Typical syntax is:

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 exclude files

I don’t think so you can filter or exclude files when using scp command. However, there is a great workaround to exclude files and copy it securely using ssh. This page explains how to filter or excludes files when using scp to copy a directory recursively.


How to use rsync command to exclude files

The syntax is:

rsync -av -e ssh --exclude='*.out' /path/to/source/ 


  1. -a : Recurse into directories i.e. copy all files and subdirectories. Also, turn on archive mode and all other options (-rlptgoD)
  2. -v : Verbose output
  3. -e ssh : Use ssh for remote shell so everything gets encrypted
  4. --exclude='*.out' : exclude files matching PATTERN e.g. *.out or *.c and so on.

Rsync command will fail if rsync not found on the remote server. In that case try the following scp command that uses bash shell pattern matching in the current directory (it won’t work with the -r option):

$ ls
Sample outputs:
centos71.log  centos71.qcow2 meta-data  user-data

Copy everything in the current directory except .new file(s):

$ shopt -s extglob
$ scp !(*.new) root@centos7:/tmp/
Sample outputs:
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


Here we have explained how to exclude files when copying files between hosts on a network under Linux or Unix-like operating systems. When using the scp command/rsync command to copy directory recursively. See the following man pages for more information:

$ man 1 rsync
$ man bash
$ man 1 scp 


Was this answer helpful? 0 Users Found This Useful (0 Votes)