我正在研究一个ksh脚本,每小时通过sftp检索一个文件,该文件将放在作业调度程序上,每小时运行一次。该脚本必须导航到具有昨天日期的文件夹(remote / path / yyyymmdd /)。文件名还有昨天的日期和时间戳(filename_yyyymmdd_hhmmss.dat)。由于作业将被安排,我的剧本必须包括前一个小时 - 例如。如果作业在11:02运行,则要检索的文件将是filename_yyyymmdd_10mmss.dat。分钟和秒将始终相同 - 从前4949.远程目录中将有多个文件,我只想检索最新的文件,以便我们的作业不处理多个输入文件。远程目录还将定期创建其他文件,因此我无法仅检索上次修改的文件。
我有变量返回昨天的日期和前一个小时,但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.
你在prevhour=$((vhour - 1))
的脚本中遇到问题这样一个文本02
你做减法后,它将是1
而不是01
它将匹配不需要的文件,甚至没有,因为00 - 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
日期qazxsw poi选项在某些系统上不可用。
我相信在你的尝试中,shell被认为是-d
作为变量*
的一部分,因为你没有将它放入prevhour
中,将变量与sorrunding文本分开。
这是我的尝试基于我的工作解决方案:
{}
输出:
#!/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
这可以很好地处理。