Bash 大括号扩展用于 2 个相同的范围

Bash 大括号扩展用于 2 个相同的范围

我想通过以下方式下载一堆编号的文本文件:

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 实际上无法确定您想要多次运行类似的操作,而不仅仅是一次带有多个参数的操作,除非您通过使用循环明确表示这一点。

相关内容