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

Why doesn't this program copy all my files, using 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:~# 

问题应该在expect eof。默认情况下 timeout10 秒所以 expect eof 会在 10 秒后 return 虽然 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