我正在研究一个ksh脚本,它每小时通过sftp检索一个文件,该文件将放置在每小时运行的作业调度程序上。该脚本必须导航到具有昨天日期的文件夹(远程/路径/ yyyymmdd /)。文件名还具有昨天的日期和时间戳(filename_yyyymmdd_hhmmss.dat)。由于将安排工作,因此我的脚本必须包含前一个小时-例如。如果作业在11:02运行,则要检索的文件将是filename_yyyymmdd_10mmss.dat。分钟和秒总是一样的-ex4949。远程目录中将有多个文件,我只想检索最新的文件,这样我们的作业就不会处理多个输入文件。远程目录中还将定期创建其他文件,因此我无法仅检索上次修改的文件。
我有一些变量可以返回昨天的日期和前一个小时,但是sftp命令没有返回完整的文件名,也没有检索文件。我尝试使用方括号,引号和括号将变量连接起来,将多个变量分配给单个变量,然后导出变量。
vdate=$(TZ=bb24 date '+%Y%m%d')
vhour=$(date '+%H')
prevhour=$((vhour - 1))
sftp user@host << EOF
lcd /my/dir/
cd /remote/path/$vdate/
get filename_$vdate_$prevhour*.dat
bye
EOF
exit
运行脚本时,找不到文件,并且没有完整的文件名 返回:
File "/remote/path/20190411/filename_20190411" not found.
代替
File "/remote/path/20190411/filename_20190411_10*.dat" not found.
我尝试的每个变量组合都返回未找到的相同变量-在filename_ $ vdate之后结束。
我尝试了一些其他组合,但始终找不到:
newvar=${vdate}_${prevhour}
get filename_$newvar*.dat
和
newvar=${vdate}\\_${prevhour}
get filename_$newvar*.dat
File "/remote/path/20190411/filename_20190411" not found.
答案 0 :(得分:1)
您在prevhour=$((vhour - 1))
的脚本中遇到问题
这样,减去后的文本02
将是1
而不是01
,并且它将与不需要的文件匹配,甚至没有匹配,因为00 - 1
是{{1 }}
-1
日期的[edvin]$ vdate=$(TZ=bb24 date '+%Y%m%d')
[edvin]$ vhour=$(date '+%H')
[edvin]$ prevhour=$((vhour - 1))
[edvin]$ echo $vhour
03
[edvin]$ echo $prevhour
2
[edvin]$ prevhour=$(date -d '1 hour ago' '+%H')
[edvin]$ echo $prevhour
02
选项在某些系统上不可用。
我相信,在您的尝试中,外壳程序被视为-d
变量*
的一部分,因为您没有将其放入将变量与混乱文本分开的prevhour
中。 / p>
这是我根据您的尝试而制定的解决方案:
{}
输出:
#!/bin/ksh
r_host='server2'
r_user='edvin'
l_dir='./content'
r_dir='./Test_folder'
# this still not cover the case of midnight
# it put 00 to 23 but day have to be yesterday as well
##vdate=$(TZ=bb24 date '+%Y%m%d')
##vhour=$(date '+%H') # not used
##prevhour=$(date -d '1 hour ago' '+%H')
# vtime = YYYYmmdd_HH -1 H
vtime=$(TZ=bb24 date -d '1 hour ago' '+%Y%m%d_%H')
sftp ${r_user}@${r_host} << EOF
lcd ${l_dir}
cd ${r_dir}
get filename_${vtime}*.dat
bye
EOF
exit
在此解决方案中,仍有很多事情可能会出错, 就像如果远程目录不存在,不可访问一样,脚本将继续执行其余命令,本地目录和文件也是如此。该连接还会运行您可能要处理的各种问题。您希望对其进行计划,因此可能需要一种解决方案来避免脚本重复生成(如果已经运行的话)。
[edvin]$ ./script.ksh
Connected to server2.
sftp> lcd ./content
sftp> cd ./Test_folder
sftp> get filename_20190415_02*.dat
Fetching /home/edvin/Test_folder/filename_20190415_020000.dat to filename_20190415_020000.dat
Fetching /home/edvin/Test_folder/filename_20190415_020100.dat to filename_20190415_020100.dat
Fetching /home/edvin/Test_folder/filename_20190415_020200.dat to filename_20190415_020200.dat
Fetching /home/edvin/Test_folder/filename_20190415_020300.dat to filename_20190415_020300.dat
Fetching /home/edvin/Test_folder/filename_20190415_020400.dat to filename_20190415_020400.dat
Fetching /home/edvin/Test_folder/filename_20190415_020500.dat to filename_20190415_020500.dat
Fetching /home/edvin/Test_folder/filename_20190415_020600.dat to filename_20190415_020600.dat
Fetching /home/edvin/Test_folder/filename_20190415_020700.dat to filename_20190415_020700.dat
Fetching /home/edvin/Test_folder/filename_20190415_020800.dat to filename_20190415_020800.dat
Fetching /home/edvin/Test_folder/filename_20190415_020900.dat to filename_20190415_020900.dat
Fetching /home/edvin/Test_folder/filename_20190415_021000.dat to filename_20190415_021000.dat
sftp> bye
是执行此操作的首选方法,因为您使用的密码少了身份验证。
如果出于某种原因不能选择scp
,那么使用scp
可以很好地解决此问题。