在lftp中使用正则表达式忽略文件名中的一些字符串



使用mget从目录中获取名称为abc_yyyymmdd_hhmss .csv的特定文件。文件夹中的示例文件:

abc_20221202_145911.csv
abc_20221202_145921.csv
abc_20221202_145941.csv
abc_20181202_145941.csv

但是,我想忽略hhmmss部分。我想要得到abc_20221202_*.csv

的所有文件如何在mget中包含*。我的代码如下:

File=abc_
Date=20221202
Filename=$File$Date"_*".csv
// Assume I have sftp connection established and I am in directory //where files with above naming convention are present. As I can //download the file when hardcoding exact file name during testing
conn=`lftp $protocol://$user:$password@$sftp_server -p $port <<EOF>/error.log
cd $path
mget $Filename
EOF`

脚本能够找到文件,但不能从服务器检索它。但是,如果我删除*并提供整个文件名abc_20221202_145941.csv,它将下载该文件。为什么*在检索文件

时会引起问题?

假设mget实际接受regex:

当前您的regexp正在查找与abc_20221202_(下划线任意次数)匹配的文件。csv

只需添加一个。在*之前匹配下划线之后的任何字符在。csv

之前的任意次数一样:

文件名=文件Date&quot美元;_。"* . csv

如果mget实际上不支持正则表达式,只需使用wget代替:

wget -r -np -nH -A "abc_20221202_.*.csv" --ftp-user=user --ftp-password=psd ftp://ip/*

我认为在使用*时反勾号符号导致了问题。一旦我删除'(反打号)并使用下面的命令,它工作得很好。

lftp -p $port $protocol://$user:$password@$sftp_server  <<EOF>/error.log
cd $path
lcd $targetPath
mget $Filename
EOF

您可能在File和Date之间漏了一个下划线。调试此类问题的一个好方法是启用调试(" debug "命令)和命令日志记录(设置cmd:trace为true)

最新更新