我希望能够编写一个 bash 脚本来自动更新我的 MediaWiki 扩展,我想我会使用这个网站https://extdist.wmflabs.org/dist/extensions/这样做。但正如您所看到的,每个 tarball 文件名在最后一个破折号 (-) 后都有一个随机的(至少在我看来是这样的)字母和数字组合。所以我想要的是一种只下载这种名称的文件的方法,extname-REL1_25*.tar.gz
其中 * 是名称中通配符出现的位置,extname
指的是我想要的扩展名的名称。
答案1
wget 括号扩展
使用 wget 的括号扩展根据模式下载多个文件。
例子:
wget -c https://extdist.wmflabs.org/dist/extensions/GoogleDocTag-REL1_{22-45203b7,23-249c6f2,24-3186a71,25-10e101f}.tar.gz
如果下载暂停或中断,可选-c
标记会从停止点继续下载。-c
当您下载大量文件并且想要批量下载所有文件而不中断时,此选项非常有用。
wget 从列表中下载多个文件
例子:
lynx -dump "https://extdist.wmflabs.org/dist/skins/" | awk '/http/{print $2}' | uniq >> list.txt
wget -c -E -H -k -K -p -e robots=off -i ./list.txt
wget 递归接受/拒绝选项
递归接受/拒绝选项 -A acclist --accept acclist -R rejlist --拒绝 rejlist 指定以逗号分隔的文件名后缀或模式列表 接受或拒绝。请注意,如果任何通配符 *、 ?、[ 或 ] 出现在 acclist 或 rejlist 元素中,则 被视为模式,而不是后缀。在这种情况下,你 必须将模式括在引号中,以防止你的 shell 扩大它,比如-A “*.mp3”或者-A '*.mp3'。
例子:
lynx -dump "https://extdist.wmflabs.org/dist/skins/" | awk '/http/{print $2}' | uniq >> list.txt
wget -c -A "Vector*.tar.gz" -E -H -k -K -p -e robots=off -i ./list.txt
和选项都会下载所有文件,然后接受和拒绝选项会删除-A
与-R
模式不匹配的下载文件。这效率极低。更快的方法是先对 list.txt 文件进行模式匹配,在下载任何内容之前从 list.txt 中删除所有不需要的文件。
假设你想从https://extdist.wmflabs.org/dist/extensions/满足以下条件:
- 版本 1.25
- 仅限选定的 MediaWiki 扩展
假设你已经创建了一个 list.txt 文件,其中包含https://extdist.wmflabs.org/dist/extensions/,在支持模式匹配的文本编辑器中打开 list.txt,过滤 list.txt 的内容以匹配包含字符串1_25
(指版本 1.25)的行,然后过滤这些结果以匹配包含要下载的 ~20 个扩展名(20 个并不重要)的行。然后将结果写入名为 new-list.txt 的新文件(文件名 new-list.txt 并不重要),并在 wget 的-i
从本地或外部文件读取 URL 选项之后使用 new-list.txt 下载多个文件(本例中数量约为 20 个)。
此方法的进一步改进是,通过过滤 list.txt 的内容以匹配包含与您正在寻找的多个扩展名相匹配的字符串的扩展名,从而减少要匹配的扩展名数量。例如,如果字符串与您正在寻找的多个扩展名wiki
相匹配,则可以过滤 list.txt 的内容以进行匹配wiki
并节省一点时间。在https://extdist.wmflabs.org/dist/extensions/有 5 个链接同时包含1_25
和wiki
,您可以通过两个模式匹配找到所有 5 个链接。
答案2
不,使用通配符是不可能的。但在这种情况下,wget 可以使用递归下载 -https://unix.stackexchange.com/questions/25340/download-recursively-with-wget