1. 问题
最近在改造shell脚本,需要将ftp协议升级成sftp,有以下一段功能代码,改造时遇到问题。下面这段代码要实现的大致功能是:通过在shell中生成动态脚本,将ftp中文件夹A下的满足AA*1(以AA开头,以1结尾)条件的文件列表导出到文件C,供后续使用
cat >$dynamicShell <<EOF
ftp -n<<!
open IP地址 端口
user 用户名 密码
binary
cd 文件夹A
prompt off
ls AA*1 文件B
close
bye
!
EOF
sh $dynamicShell
#因为上面导出的是详细信息,最后一列是文件名
awk '{print $NF}' 文件B > 文件C
原本打算简单点,直接转换成:
cat >$dynamicShell <<EOF
sftp -oIdentity=私钥路径 -oPort=端口 用户名@IP地址 <<!
cd 文件夹A
ls AA*1 文件B
bye
!
EOF
sh $dynamicShell
awk '{print $NF}' 文件B > 文件C
执行修改后的脚本发现并没有将文件夹A中的文件列表导出,另外sftp也不支持ls使用正则表达式。
2. 解决方案
根据最终目标,转换下思路,先将文件夹A下所有文件的列表导出,然后再通过正则过滤,具体实现如下:
lftp -c "connect sftp://用户名:@IP地址; ls 文件夹A" > 文件B
awk '{if($NF~/AA.*1/)print $NF}' 文件B > 文件C
3. 结语
以上方案,仅供参考。笔者对shell脚本也只是业余,如有错误之处,敬请指正。如果哪位大神有更好的方法,也请指教,不胜感激!
本文介绍了如何在shell脚本中将sftp的ls命令结果导出到文件,解决sftp不支持ls正则表达式的问题。通过先导出所有文件列表,再进行正则过滤,实现了从远程文件夹获取特定文件名的列表。
2794

被折叠的 条评论
为什么被折叠?



