我想通过以下方式下载一堆编号的文本文件:
curl https://www.grc.com/sn/sn-{472..807}.txt > sn-{472..807}.txt
但这给了我:
bash: sn-{472..807}.txt: 不明确的重定向
所以我最终做了一个:
for iEpisode in {472..807}; do
curl https://www.grc.com/sn/sn-"$iEpisode.txt" > sn-"$iEpisode.txt";
if [[ $? -eq 1 ]]; then exit; fi;
done
问题是:有没有办法做一个简单的 curl
带双支撑延伸?
(因为它对我来说并不含糊,而我的谷歌无济于事) :/
答案1
这是不明确的,因为您正在尝试重定向到多个文件。你的 shell 会选择哪个?
一般来说,您将需要循环for
,但使用 Curl 您可以使用
curl --remote-name-all https://www.grc.com/sn/sn-{472..807}.txt
该选项就像-O
(参见手册页),
-O, --远程名称
将输出写入本地文件,其名称类似于我们获得的远程文件。 (仅使用远程文件的文件部分,路径被切断。)
但将其应用于每个论点。
Curl 还理解类似 shell 的范围:
curl -O 'https://www.grc.com/sn/sn-[472-807].txt'
答案2
echo hello > sn-{472..807}.txt
我希望sn-472.txt
...sn-807.txt
包含“你好”?
这在 Zsh 中可以工作,但在 Bash 中则不然。
但无论如何,仍然只有一个输出流curl
,所以类似
zsh% curl https://www.grc.com/sn/sn-{472..807}.txt > sn-{472..807}.txt
将使curl 将每个下载的文件输出到同一个流,然后Zsh 将从该流将整个集复制到每个输出文件。
shell 实际上无法确定您想要多次运行类似的操作,而不仅仅是一次带有多个参数的操作,除非您通过使用循环明确表示这一点。