在一个复制命令停止后,如何让shell脚本继续复制文件?

时间:2012-08-09 13:33:49

标签: bash shell scripting cygwin

我在WinXP上运行Cygwin。我编写了以下shell脚本来将文件从网络驱动器复制到远程服务器......

scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*TE* dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level1
scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*SE* dalvarado@localhost:/var/www/html/sbo/2010/student/ela/level1
scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*TE* dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level2
scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*SE* dalvarado@localhost:/var/www/html/sbo/2010/student/ela/level2

问题是当我运行这个脚本时,偶尔我会得到如下所示的错误(“没有这样的文件或目录”),然后脚本将停止。

sh copy_files.sh    
...
cb_sb_ela_miu_L1_U2_activity2_12_SE.pdf                                                                                                           100%  771KB  51.4KB/s   00:15
cb_sb_ela_miu_L1_U2_activity2_13_SE.pdf                                                                                                           100%  716KB  55.0KB/s   00:13
cb_sb_ela_miu_L1_U2_activity2_14_SE.pdf                                                                                                           100%  966KB  50.8KB/s   00:19
cb_sb_ela_miu_L1_U2_activity2_15_SE.pdf                                                                                                            71%  640KB  36.9KB/s   00:06 ETA
//tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/cb_sb_ela_miu_L1_U2_activity2_15_SE.pdf: No such file or directory

有没有办法让脚本能够继续复制文件,即使这个错误信息出现了?

3 个答案:

答案 0 :(得分:0)

尝试一次复制一个文件。这样,失败的副本不会杀死脚本和其他副本。这是循环......

for i in //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*TE*
do
    scp -P 9998 "$i" dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level1
done

for i in //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*SE*
do
    scp -P 9998 "$i" dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level1
done

for i in //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*TE*
do
    scp -P 9998 "$i" dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level2
done

for i in //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*SE*
do
    scp -P 9998 "$i" dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level2
done

答案 1 :(得分:0)

您使用的脚本是从网络驱动器进行scp复制。可能是网络问题导致整个脚本在源文件(scp只是复制)或目标变得不可用时停止。
进行此类传输之前的最佳方法是首先将文件复制到本地缓冲区,必要时进行检查,将它们存档到一个文件中,然后将它们发送到目标服务器中,这些文件已经是理想的目录结构。 通过这种方式,您可以更好地了解失败的方面或方面。

到目前为止,这种传输脚本的脚本最佳实践。

仅集中于小片段,scp行 - 一个副本命令就是这一行:

scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*TE* \
            dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level2

您在脚本中使用了4个这样的命令,如果挂起,则不会让其他行继续运行。所以在你的算法中,下面的方法会更好:

scp -P 9998 <sourceL1TE> <targetL2TE> &
scp -P 9998 <sourceL2TE> <targetL2TE> &
scp -P 9998 <sourceL1SE> <targetL2TE> &
scp -P 9998 <sourceL2SE> <targetL2TE> &

&符号会将每一行发送到后台,以便其他行也可以启动,而无需等待前一行完成。

接下来,您在batchmode中使用scp,而不通知scp在batchmode中的行为。你应该考虑:

scp -Bq -P 9998 <sourceL1TE> <targetL2TE> &
scp -Bq -P 9998 <sourceL2TE> <targetL2TE> &
scp -Bq -P 9998 <sourceL1SE> <targetL2TE> &
scp -Bq -P 9998 <sourceL2SE> <targetL2TE> &

它将使脚本的其余部分继续。

现在知道一些传输问题导致偶尔scp过时,你可以通过添加超时选项来解决陈旧问题。如果连接太长,它可以帮助停止scp。

scp -Bq -o ConnectTimeout 30 -P 9998 <sourceL1TE> <targetL2TE> &
scp -Bq -o ConnectTimeout 30 -P 9998 <sourceL2TE> <targetL2TE> &
scp -Bq -o ConnectTimeout 30 -P 9998 <sourceL1SE> <targetL2TE> &
scp -Bq -o ConnectTimeout 30 -P 9998 <sourceL2SE> <targetL2TE> &

等等。

有很多方法可以使用bash脚本和scp选项以及其他实用程序来更好地完成它。以上只是一个好的开始。您甚至可以考虑关注失败的内容并为失败的源重新启动scp。

答案 2 :(得分:-1)

查看日志

sh copy_files.sh    
...
cb_sb_ela_miu_L1_U2_activity2_12_SE.pdf                                                                                                           100%  771KB  51.4KB/s   00:15
cb_sb_ela_miu_L1_U2_activity2_13_SE.pdf                                                                                                           100%  716KB  55.0KB/s   00:13
cb_sb_ela_miu_L1_U2_activity2_14_SE.pdf                                                                                                           100%  966KB  50.8KB/s   00:19
cb_sb_ela_miu_L1_U2_activity2_15_SE.pdf                                                                                                            71%  640KB  36.9KB/s   00:06 ETA
//tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/cb_sb_ela_miu_L1_U2_activity2_15_SE.pdf: No such file or directory

很明显,scp命令无法在该目标中找到文件cb_sb_ela_miu_L1_U2_activity2_15_SE.pdfscp是一个相当简单的工具,但如果您要复制的源根本不存在,则会抛出错误。我可能“有可能”在scp命令到达文件(使用通配符)时,文件被移动或删除。此外,建议您将recursive标志用于外卡副本,例如

scp -Bpqr //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*TE* dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level1

您还可以在执行scp之前对每个文件执行文件检查以查看文件是否存在。通过这种方式,您始终可以确定您要传输的文件确实存在。

#copies all level1 files to level1 directory
for file in `ls -1 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*`
do
   if [ -f $file ] then
     scp -Bpq $file dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level1
   fi
done

#copies all level2 files to level2 directory
for file in `ls -1 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*`
do
   if [ -f $file ] then
     scp -Bpq $file dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level2
   fi
done