【问题标题】:Curl in For-Loops Using GitBash & Assigning Unique Output Names使用 GitBash 在 For 循环中卷曲并分配唯一的输出名称
【发布时间】:2021-02-20 16:40:34
【问题描述】:

我的目标是读取我存储的网站的.txt 文件,然后将.txt 文件中每个条目的内容输出为.nc 文件。这是我第一次使用 GitBash,我认为我已经构建了一些基本循环,但我不确定如何从 .txt 文件中卷曲每个网站并使用适当的名称输出它。下面我包含了一个最小的工作示例:

输入(mytextfile.txt):

https://data.pacificclimate.org/data/downscaled_gcms/tasmax_day_BCCAQv2+ANUSPLIN300_MRI-CGCM3_historical+rcp45_r1i1p1_19500101-21001231.nc.nc?tasmax[0:55114][152:152][290:290]
https://data.pacificclimate.org/data/downscaled_gcms/tasmax_day_BCCAQv2+ANUSPLIN300_GFDL-ESM2G_historical+rcp45_r1i1p1_19500101-21001231.nc.nc?tasmax[0:55114][152:152][290:290]
https://data.pacificclimate.org/data/downscaled_gcms/tasmax_day_BCCAQv2+ANUSPLIN300_HadGEM2-ES_historical+rcp45_r1i1p1_19500101-21001231.nc.nc?tasmax[0:55114][152:152][290:290]

代码:

for url in $(mytextfile.txt); do 
curl --globoff "$url" > FileNameGoesHere.nc

为每个 URL 输出单独的 .nc 文件:

tasmax45_MRI-CGCM3.nc
tasmax45_GFDL-ESM2G.nc
tasmax45_HadGEM2-ES.nc

所以据我了解,现在脚本会读取我的文本文件的每一行,对其执行 curl,然后使用 > 输出,但我希望每个输出文件都有一个特定的名称。

如果我使用的是 Python,那么我会想到 zip(url,out_name)(虽然不确定这是否是 GitBash 中的东西)。此外,有时当我卷曲时,网页内容不会完全下载(例如,如果文件为 500kb,有时由于连接错误,它会以 450kb 下载),所以如果有人有兴趣帮助我构建一些功能,以便如果发生这种情况它会重新下载,那很好,但没必要。

【问题讨论】:

标签: bash curl git-bash


【解决方案1】:

Don't read lines with for.

while read -r url; do
    outputfile=${url%%+*}
    curl --globoff -o "${outputfile##*/}.nc" "$url"
done <mytextfile.txt

这使用了几个parameter expansions 从URL 中分离出产品名称。另外,我们使用curl-o 选项来指定输出文件名,而不是shell 重定向。

【讨论】:

  • 我尝试执行此操作,但在done 行之后,我又得到了另一个正在寻找命令的胡萝卜?
  • 您的意思可能是“插入符号”,或者您真的看到橙色蔬菜吗?如果文件包含有效的 URL,它应该已经下载了它们(尽管通常 curl 没有 -s 会为每个打印一个进度报告)。
  • 感谢更新的问题;我对此进行了重构,以指定您在问题中暗示(但不解释)的输出文件名。前面的代码将尝试在当前目录中创建名为 http: 等的目录,然后在其中创建一个子目录 data.pacificclimate.org 等,这可能会失败(除非这些目录由于其他原因已经存在)。
猜你喜欢
  • 2023-03-08
  • 2018-09-10
  • 1970-01-01
  • 2019-12-16
  • 2013-01-27
  • 2016-08-16
  • 1970-01-01
  • 2015-06-14
  • 2014-04-18
相关资源
最近更新 更多