使用wget结合正则表达式选择性下载文件时/i匹配失效问题
搞定wget正则匹配太宽泛的问题
嘿,我来帮你捋清楚这个问题的根源,以及怎么解决它~
为啥第一个命令会下载所有jpg?
你用的正则.*/i.*.jpg其实有个坑:它匹配的是整个URL路径里任意位置包含字母i的jpg文件,而不是你想要的「文件名以i开头」的文件。举个例子,如果某个jpg文件的上级目录叫images,或者域名里有个i,那这个正则都会把它匹配上,再加上-A jpg的过滤,自然就下载了所有jpg。
而换成.*/in.*.jpg时,刚好你的目标文件名都是以in开头,其他jpg的路径里没这个组合,所以就精准命中了——这纯属巧合,不是正确的解决思路哦。
另外你提到的「/i表示不区分大小写」是其他正则引擎(比如JS)的写法,wget用的POSIX正则根本不吃这一套,所以这个误解和当前问题没关系哈。
正确的正则写法,精准锁定目标文件
要只下载文件名以i开头的jpg,得让正则只盯着文件名部分,而不是整个路径。给你两种靠谱的写法:
写法1:精准匹配文件名开头
用[^/]*来匹配文件名(因为文件名里不会有/),确保只有文件名以i开头的才被匹配:
wget -r -nd -P test -A jpg --accept-regex '.*/i[^/]*\.jpg'
拆解一下:
.*/:匹配到最后一个/之前的所有路径内容i[^/]*:匹配以i开头、后面跟任意非/字符的文件名\.jpg:转义后的.jpg,避免.匹配任意字符
写法2:锚定URL结尾
直接用$锁定URL的末尾,确保文件名以i开头且以.jpg结尾:
wget -r -nd -P test -A jpg --accept-regex 'i.*\.jpg$'
这个更简洁,$表示URL必须以.jpg结尾,前面的i.*就只会匹配文件名的开头部分了。
先测试再下载,避免踩坑
建议先加--dry-run参数做个模拟下载,看看输出里是不是只有你要的两个文件:
wget -r -nd -P test -A jpg --accept-regex '.*/i[^/]*\.jpg' --dry-run
没问题再去掉--dry-run实际下载就行~
内容的提问来源于stack exchange,提问作者Plouf
相关产品推荐
相关产品推荐

