为什么这个程序不使用scp复制我的所有文件?

时间:2018-05-22 16:22:15

标签: list expect scp

我写了一个小程序,在第一种情况下,切片文件和目录名列表,这样我就得到了一个文件列表和一个目录列表。

#!/usr/bin/expect -f

set mdproot "****"
set mySource "****"
set myDest "****"
set myDirs {}
set myFiles {}
set i 1
set y 0

lappend myDirs [lindex $argv 0]

foreach variable $argv {
    lappend myDirs [lindex $argv $i+1]
    lappend myFiles [lindex $argv $y+1]
    incr y
    incr y
    incr i
    incr i
}

set DIRECTORIES [lsearch -all -inline -not -exact $myDirs {}]
set FILES  [lsearch -all -inline -not -exact $myFiles {}]

#puts "   "
#puts $DIRECTORIES
#puts "   "
#puts $FILES

foreach file $FILES dir $DIRECTORIES  {
    puts " Fichier : $file et repertoire : $dir"
    spawn scp -p "$mySource/$file" "$myDest/$dir"
    expect -re "(.*)assword: " {sleep 1; send -- "$mdproot\r" }
    expect  eof { return}
}

有我的清单:

$argv

2017-11-30 
2017-11-30_15-10-44_P_8294418.33_Q1 
2017-11-30 
2017-11-30_15-10-44_R_8294418.33_Q1 
2018-03-07 
2018-03-07_09-30-57_R_HOURS_Q1 
2018-04-13 
2018-04-13_13-23-25_R_HOURS_Q1 
2018-05-02 
2018-05-02_11-19-37_R_HOURS_Q1 
2018-03-07 
2018-3-7_9-30-57_P_HOURS_Q1 
2018-04-13 
2018-4-13_13-23-25_P_HOURS_Q1 
2018-05-02 
2018-5-2_11-19-37_P_HOURS_Q1

$DIRECTORIES

2017-11-30 
2017-11-30 
2018-03-07 
2018-04-13 
2018-05-02 
2018-03-07 
2018-04-13 
2018-05-02

$FILES

2017-11-30_15-10-44_P_8294418.33_Q1 
2017-11-30_15-10-44_R_8294418.33_Q1 
2018-03-07_09-30-57_R_HOURS_Q1 
2018-04-13_13-23-25_R_HOURS_Q1 
2018-05-02_11-19-37_R_HOURS_Q1 
2018-3-7_9-30-57_P_HOURS_Q1 
2018-4-13_13-23-25_P_HOURS_Q1 
2018-5-2_11-19-37_P_HOURS_Q1

实际上我遇到了2个问题(如果我们计算这段代码是多么糟糕的话,就会有3个问题)。 首先,当我运行我的程序时,我为我正在复制的每个文件都有我的%指示符,除了最后一个,它们都会在它们达到100%之前停止。 然后,我可以看到scp命令没有在所有文件上完成,程序每次都在第4个文件停止。

root@raspberrypi:~# ./recupFileName.sh 

spawn scp -p /root/muonic_data/2017-11-30_15-10-44_P_8294418.33_Q1 marpic@192.168.110.90:/home/marpic/muonic_data/Data_Q1/2017-11-30
marpic@192.168.110.90's password: 
2017-11-30_15-10-44_P_8294418.33_Q1            15%   68MB   6.9MB/s   00:53 
spawn scp -p /root/muonic_data/2017-11-30_15-10-44_R_8294418.33_Q1 marpic@192.168.110.90:/home/marpic/muonic_data/Data_Q1/2017-11-30
marpic@192.168.110.90's password: 
2017-11-30_15-10-44_R_8294418.33_Q1            41%   69MB   8.5MB/s   00:11 
spawn scp -p /root/muonic_data/2018-03-07_09-30-57_R_HOURS_Q1 marpic@192.168.110.90:/home/marpic/muonic_data/Data_Q1/2018-03-07
marpic@192.168.110.90's password: 
2018-03-07_09-30-57_R_HOURS_Q1                 82%   51MB   7.2MB/s   00:01 
spawn scp -p /root/muonic_data/2018-04-13_13-23-25_R_HOURS_Q1 marpic@192.168.110.90:/home/marpic/muonic_data/Data_Q1/2018-04-13
marpic@192.168.110.90's password: 
2018-04-13_13-23-25_R_HOURS_Q1                100% 6940KB   6.8MB/s   00:01

正如您所看到的,应该有8个文件以100%的准确率复制,但没有错误消息,因此我不知道从哪里开始我的研究。

编辑:

我在我的脚本中添加了“set timeout -1”,但现在脚本只是以100%的准确率复制我的第一个文件,然后停止。任何答案?

root@raspberrypi:~# ./recupFileName.sh 
 Fichier : 2017-11-30_15-10-44_P_8294418.33_Q1 et repertoire : 2017-11-30
spawn scp -p /root/muonic_data/2017-11-30_15-10-44_P_8294418.33_Q1 marpic@192.168.110.90:/home/marpic/muonic_data/Data_Q1/2017-11-30
marpic@192.168.110.90's password: 
2017-11-30_15-10-44_P_8294418.33_Q1           100%  437MB   7.5MB/s   00:58    
root@raspberrypi:~# 

1 个答案:

答案 0 :(得分:1)

问题应该在expect eof。默认情况下,timeout10秒,因此expect eof会在10秒后返回,但scp仍在运行。

您可以使用更大的timeout

选项#1:

# set the default `timeout'
set timeout 3600 ; # or -1 for no timeout

选项#2:

expect -timeout 3600 eof

请注意你的

expect eof { return }

将退出整个脚本,因此foreach循环仅运行一次,您只需要

expect eof