不通过SFTP get命令返回多变量字符串

问题描述 投票:0回答:1

我正在研究一个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.
shell concatenation ksh
1个回答
1
投票

你在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这可以很好地处理。

© www.soinside.com 2019 - 2024. All rights reserved.