我在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
有没有办法让脚本能够继续复制文件,即使这个错误信息出现了?
答案 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.pdf
。 scp
是一个相当简单的工具,但如果您要复制的源根本不存在,则会抛出错误。我可能“有可能”在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