ubuntu scp命令的一个问题


今天碰到一个小问题,scp从远端复制目录时,与期望结果不符; 恰好在之后一个同事将远端目录误删,导致数据丢失,只得重新生产数据,浪费几个小时。
这个scp的问题以前没有留意过,觉得有必要记录下。

问题记录

有一台远程机器remote_host,其上有一个目录~/testscp, 其目录结构如下:

1
2
3
4
5
6
7
8
testscp
├── f1
│   └── info.txt
├── f2
│   └── info.txt
├── f3
│   └── info.txt
└── info.txt

出问题的scp命令是远端目录带*号时:

1
scp -r remote_host:~/testscp/* testscp

问题表现:

  1. 若本地testscp目录存在,则scp拷贝一切正常,完整的文件和目录结构会被拷贝到本地
  2. 若本地testscp不存在,则其会创建testscp目录, 但是拷贝结果中只有一个info.txt,多个子目录中的相同的文件被覆盖到一个位置。
  3. 反过来,若将本地目录拷贝到远端: scp -r testscp/* remote_host:~/testscp, 则会明确要求远端目录存在,否则给出错误提示。

正确的用法:

1
2
mkdir testscp
scp -r remote_host:~/testscp/* testscp

相关问题

scp -r不带*号时,其表现也值得留意,比如:

1
scp -r remote_host:~/testscp testscp

其表现为:

  1. 若本地testscp目录不存在,则将远端testscp整个拷贝到当前目录中。
  2. 若本地当前目录存在testscp, 则将远端testscp拷贝到本地testscp中,即本地生成testscp/testscp目录。

作为对比,cp命令的表现就简单多了,其要求目标目录必须存在,所以就不存在以上问题。