在同一路径上远程复制文件

在同一路径上远程复制文件

我在某些目录中有数千个 csv 文件。我想将其中一个 csv 文件复制到同一路径上的远程计算机,如果远程计算机没有目录,那么它应该创建目录并将其复制到该路径。

foo.csv让我用例子来详细说明,假设我在某些目录中调用了文件

test/
├── 201512
    └── foo.csv
    └── bar.csv
├── 201601
    └── foo.csv
    └── abc.csv 
├── 201602
    └── foo.csv
    └── xyz.csv
.
.
├── 201612
    └── foo.csv
    └── asd.csv

我想foo.csv在与源计算机相同的路径上复制到远程计算机。因此/test/201512/foo.csv应该复制到/test/201512/远程的同一路径。如果远程计算机没有该目录路径,则应该创建它。是否有任何实用程序可以实现此目的rsyncscp

(笔记:所有目录中的内容foo.csv可能不同)

答案1

设置,在我的 Vagrant 盒子上完成:

$ mkdir -p test/20{1512,16{01..12}}
$ for d in !$; do printf 'I am a csv file in %s\n' "$d" > "$d"/foo.csv; printf 'I am a different file; do not copy me!\n' > "$d"/abc.csv; done

设置后的目录结构:

[vagrant@localhost ~]$ tree test
test
├── 201512
│   ├── abc.csv
│   └── foo.csv
├── 201601
│   ├── abc.csv
│   └── foo.csv
├── 201602
│   ├── abc.csv
│   └── foo.csv
├── 201603
│   ├── abc.csv
│   └── foo.csv
├── 201604
│   ├── abc.csv
│   └── foo.csv
├── 201605
│   ├── abc.csv
│   └── foo.csv
├── 201606
│   ├── abc.csv
│   └── foo.csv
├── 201607
│   ├── abc.csv
│   └── foo.csv
├── 201608
│   ├── abc.csv
│   └── foo.csv
├── 201609
│   ├── abc.csv
│   └── foo.csv
├── 201610
│   ├── abc.csv
│   └── foo.csv
├── 201611
│   ├── abc.csv
│   └── foo.csv
└── 201612
    ├── abc.csv
    └── foo.csv

13 directories, 26 files
[vagrant@localhost ~]$ cat test/201609/foo.csv 
I am a csv file in test/201609
[vagrant@localhost ~]$ 

接下来,从我自己的盒子(不是流浪盒子):

rsync -ame 'ssh -p 2222' -f '+ */' -f '+ foo.csv' -f '- *' [email protected]:/home/vagrant/test .

结果:

$ find test
test
test/201512
test/201512/foo.csv
test/201601
test/201601/foo.csv
test/201602
test/201602/foo.csv
test/201603
test/201603/foo.csv
test/201604
test/201604/foo.csv
test/201605
test/201605/foo.csv
test/201606
test/201606/foo.csv
test/201607
test/201607/foo.csv
test/201608
test/201608/foo.csv
test/201609
test/201609/foo.csv
test/201610
test/201610/foo.csv
test/201611
test/201611/foo.csv
test/201612
test/201612/foo.csv

选项注释rsync

这里再次是使用的命令:

rsync -ame 'ssh -p 2222' -f '+ */' -f '+ foo.csv' -f '- *' [email protected]:/home/vagrant/test .

-a是“归档”开关,意味着递归复制目录,保留权限等。

-m意味着不会复制任何空目录(例如,如果缺少其中一个日期目录,foo.csv我们不会创建该目录)。

-e 'ssh -p 2222'只是因为我使用的是 Vagrant 盒子,它的 SSH 端口与 22 端口不同;你可以省略这部分。

-f引入“过滤”规则。您可以包含或排除文件。我使用的过滤器应该是相当不言自明的,但为了澄清'+ */'过滤器,我们需要包含所有目录,以便foo.csv文件到达

请在手册页中阅读更多相关信息:

LESS='+/INCLUDE\/EXCLUDE PATTERN RULES' man rsync

相关内容