我在某些目录中有数千个 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/
远程的同一路径。如果远程计算机没有该目录路径,则应该创建它。是否有任何实用程序可以实现此目的rsync
?scp
(笔记:所有目录中的内容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