【问题标题】:Bash/Shell Download file from links in CSV FileBash/Shell 从 CSV 文件中的链接下载文件
【发布时间】:2017-11-03 11:32:51
【问题描述】:

CSV 文件有 2 列,格式如下:

姓名;链接由 , ; 分隔

例如

Product_1;www.example.com/product_1.png,www.example.com/product_2.png;

我正在尝试创建一个 while 循环,以便它可以下载图像并相应地重命名它们,但无法弄清楚

// 对不起,我自己解释错了,我的意思是说,如果可能的话,我希望下载的图片在第一列中使用 _1、_2 等名称

这是我到现在为止得到的结果

#!/usr/bin/env bash
fname="$1"
while IFS=";" read f1 f2
do
  mkdir -p "$f1";
  wget -P "$f1" "$f2"
done < "$fname"

它只适用于一个文件,有什么方法可以让我的生活更轻松吗?

【问题讨论】:

  • 你知道你有多少链接吗?还是链接数是固定的?
  • @ClintonLam 每个名称/对象从 2 到 12-13 的任意位置
  • 所有链接用逗号‘,’分隔?
  • 您是否也尝试过 read -r f1 f2 用于递归读取行?
  • @ClintonLam 不,没有尝试过 -r,我不确定它是否会用 , 分隔链接(因为它们在 csv 中)

标签: bash shell unix


【解决方案1】:

我相信这就是你想要的。

#!/usr/bin/env bash
fname="$1"

# Loop through each line
while IFS=";" read -r f1 f2 _; do
    # Create directory
    mkdir -p "$f1"
    # Loop through comma separated links
    IFS=, read -r -a items <<< "$f2"
    for i in $items; do

        # Auto sequencing file name
        number=0; suffix="";
        while test -e "$f1/$f1$suffix.png"; do
            (( ++number ))
            suffix=$( printf -- '-%02d' "$number" )
        done
        outname="$f1/$f1$suffix.png"

        # Download file
        wget -P "$f1" -O "$outname" "$i"

    done
done < "$fname"

【讨论】:

  • 非常接近我想要的,这会将它们放在我想要的名称的文件夹中,而不是重命名它们,有什么办法可以扭转这种局面吗?
  • 不确定你的意思。你可以在你的问题中添加它吗?
  • 将它们放在具有第一列名称的文件夹中很好,但我想用 CSV 列的第一个选项卡的名称重命名下载的文件,例如,如果名称是 toto,有两个文件可供下载,它们将位于名为 toto_1 和 toto_2 的文件夹 toto(已经工作)中
  • 此答案中的代码将受益于通过shellcheck.net 运行并找到已修复的问题。现在,在f1 中放置空格的输入文件可以提供任意的wget 选项,从而覆盖它选择的其他文件并以其他方式进行恶作剧。
  • 我还考虑将其设为read f1 f2 _,以便我们在任何; 处修剪f2,而不是将尾随内容放入该变量中。还有更好的做法是使用IFS=, read -r -a items &lt;&lt;&lt;"$f2" 将字符串读入数组——这样您就不会像使用for i in $(...) 那样将* 替换为当前目录中的文件列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2018-06-20
  • 2014-06-21
相关资源
最近更新 更多