【发布时间】:2019-09-03 06:38:39
【问题描述】:
我正在编写一个 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.
【问题讨论】:
-
*(s)ftp客户是出了名的问题(我没说有问题:-))。您的代码看起来应该可以工作。我会手动运行sftp并输入每个cmd。当您到达get file...时,我会将其替换为dir file...*和 1. 确认文件确实存在 2. 看看您是否发现了filename_$vdate_$prevhour*.dat无法正常工作的某些原因。如果您可以通过手动输入所有内容来使其工作,那么您必须查看ksh正在处理的内容。在 here-doc 中更难做。 .... -
啊,也许你需要使用
mget,即使只有一个文件。*可能会把它扔掉。 .... 否则,在单独的终端窗口中,手动执行对filename_$vdate_$prevhour*.dat的分配,然后在命令行上执行echo filename_$vdate_$prevhour*.dat并将该值复制/粘贴到您的sftp会话中。祝你好运! -
请尝试使用这种格式
get filename_${vdate}_${prevhour}*.dat -
@shellter @edvin 我尝试了这两种方法,但都不成功。手动运行命令并回显返回所需的输出,但是一旦我通过 sftp 手动输入命令,输出就会不匹配。 sftp客户端中的变量数量是否有字符限制或限制?我最终可能只是检索
filename*并让脚本删除不是前一小时的副本。
标签: shell concatenation ksh