有时候,有这样的需求,就是根据一个文档中的文件列表来同步文件。举一个例子,1.txt 是文件列表,内容为:
cat 1.txt
/data/a/a.txt
/data/b.txt
/data/c/b/c.txt
那么同步的命令应该是
rsync -av --files-from=1.txt / ip::module/
需要注意的是, 1.txt 中如果写全局路径,那么source目录需要写/
cat 1.txt
/data/a/a.txt
/data/b.txt
/data/c/b/c.txt
那么同步的命令应该是
rsync -av --files-from=1.txt / ip::module/
需要注意的是, 1.txt 中如果写全局路径,那么source目录需要写/
0
#!/usr/bin/expect
set timeout 50
set host [lindex $argv 0]
set file [lindex $argv 1]
set passwd "123456"
spawn rsync -av --files-from=2.txt /usr/local/sbin/shell/ root@$host:$file #用来指明2.txt中文件的路径,2.txt中只要写要同步的文件名就好了。
expect {
"yes/no" {send "yes\r"}
"password:" {send "$passwd\r"}
}
expect eof
set timeout 50
set host [lindex $argv 0]
set file [lindex $argv 1]
set passwd "123456"
spawn rsync -av --files-from=2.txt /usr/local/sbin/shell/ root@$host:$file #用来指明2.txt中文件的路径,2.txt中只要写要同步的文件名就好了。
expect {
"yes/no" {send "yes\r"}
"password:" {send "$passwd\r"}
}
expect eof
0
本帖最后由 疯疯小和尚 于 2016-8-8 21:46 编辑
如果list文件里写相对路径,实验如下:
[root@centos201 ~]# cd /tmp/
[root@centos201 tmp]# vim list01.txt
加入
aaa
bbb/bb
ccc/c.txt
[root@centos201 tmp]# mkdir -p aaa bbb/bb ccc
[root@centos201 tmp]# echo 'c'>ccc/c.txt
[root@centos201 tmp]# vim 8.expect
#! /usr/bin/expect
set passwd "654321"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -avzP --files-from=list01.txt ./ root@$host:$file
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof
开始进行同步测试[root@centos201 tmp]# chmod u+x 8.expect
[root@centos201 tmp]# ./8.expect 192.168.2.205 /usr/local/test01
spawn rsync -avzP --files-from=list01.txt ./ root@192.168.2.205:/usr/local/test01
root@192.168.2.205's password:
building file list ...
5 files to consider
created directory /usr/local/test01
aaa/
bbb/
bbb/bb/
ccc/
ccc/c.txt
2 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/5)
sent 131 bytes received 43 bytes 348.00 bytes/sec
total size is 2 speedup is 0.01
检查另一台机器
[root@centos05 tmp]# tree /usr/local/test01/
/usr/local/test01/
├── aaa
├── bbb
│ └── bb
└── ccc
└── c.txt
4 directories, 1 file
如果list文件里写相对路径,实验如下:
[root@centos201 ~]# cd /tmp/
[root@centos201 tmp]# vim list01.txt
加入
aaa
bbb/bb
ccc/c.txt
[root@centos201 tmp]# mkdir -p aaa bbb/bb ccc
[root@centos201 tmp]# echo 'c'>ccc/c.txt
[root@centos201 tmp]# vim 8.expect
#! /usr/bin/expect
set passwd "654321"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -avzP --files-from=list01.txt ./ root@$host:$file
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof
开始进行同步测试[root@centos201 tmp]# chmod u+x 8.expect
[root@centos201 tmp]# ./8.expect 192.168.2.205 /usr/local/test01
spawn rsync -avzP --files-from=list01.txt ./ root@192.168.2.205:/usr/local/test01
root@192.168.2.205's password:
building file list ...
5 files to consider
created directory /usr/local/test01
aaa/
bbb/
bbb/bb/
ccc/
ccc/c.txt
2 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/5)
sent 131 bytes received 43 bytes 348.00 bytes/sec
total size is 2 speedup is 0.01
检查另一台机器
[root@centos05 tmp]# tree /usr/local/test01/
/usr/local/test01/
├── aaa
├── bbb
│ └── bb
└── ccc
└── c.txt
4 directories, 1 file
0
JerryChan - 广东某工业大学大四拼命找offer的渣渣
测试了一下,1.txt上面如果不写全局路径的话,在写命令的时候source的/需要把路径补全,同样可以达到1.txt写全局路径的效果,而且发现这个--files-from只能是同步文件,参数名的意思也是如此
编辑回复