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

lrl1mhuk  于 2022-12-12  发布在  Unix
关注(0)|答案(3)|浏览(179)

bounty将在3天后过期。回答此问题可获得+50声望奖励。likeGreen希望吸引更多人关注此问题。

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

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

但是,我想忽略hhmmss部分。我想得到所有文件与abc_20221202_*.csv
如何在mget.my中包含 * 代码如下:

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,它将下载文件。为什么 * 会导致检索文件时出现问题

rmbxnbpk

rmbxnbpk1#

假设mget实际上接受正则表达式:
当前,您的regexp正在查找与abc_20221202_(下划线任意次数).csv匹配的文件
只需在 * 之前添加一个.,这样它就可以匹配.csv之前的下划线之后的任意字符任意次数
就像这样:
文件名=$File$日期”_.*".csv
如果mget实际上不支持regex,就用wget代替:

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

gxwragnw2#

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

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

bnl4lu3b3#

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

相关问题