将CSV中的URL下载到第一个字段中指定的子目录中

时间:2019-01-07 15:34:45

标签: bash shell csv

所以我想将我的产品导出到我的新网站中。我有一个包含以下数据的csv文件:

product id,image1,image2,image3,image4,image5
1,https://img.url/img1-1.png,https://img.url/img1-2.png,https://img.url/img1-3.png,https://img.url/img1-4.png,https://img.url/img1-5.png
2,https://img.url/img2-1.png,https://img.url/img2-2.png,https://img.url/img2-3.png,https://img.url/img2-4.png,https://img.url/img2-5.png

我要做的是制作一个脚本来读取该文件,创建以产品ID命名的目录,下载产品图像并将其放在自己的文件夹中(文件夹1 =>产品ID 1的image1-image5 ,文件夹2 =>产品ID 2的image1-image5,依此类推)。

如果更容易做到,我可以制作一个普通的文本文件,而不是使用excel格式。谢谢你。

对不起,我真的很新。我还不懂代码,因为我一无所知,但是我想做的是这样的:

for id in $product_id; do
  mkdir $id && cd $id && curl -o $img1 $img2 $img3 $img4 $img5 && cd ..
done

2 个答案:

答案 0 :(得分:0)

这是一次快速而肮脏的尝试,希望它至少可以使您了解如何处理此问题。

#!/bin/bash

tr ',' ' ' <products.csv |
while read -r prod urls; do
     mkdir -p "$prod"
     # Potential bug: urls mustn't contain shell metacharacters
     for url in $urls; do
         wget -P "$prod" "$url"
     done
done

如果您更喜欢( cd "$prod" && curl -O "$url" ),则可以等效地进行curl;我通常会这样做,尽管可以使用wget设置输出目录的选项很方便。

如果您的CSV包含围绕字段的引号,或者您需要处理包含外壳元字符(不规则空格,碰巧与当前目录中的文件相匹配的通配符等)的URL,但是最显着的&意味着可以运行后台的shell命令)也许尝试类似

while IFS=, read -r prod url1 url2 url3 url4 url5; do
    mkdir -p "$prod"
    wget -P "$prod" "$url1"
    wget -P "$prod" "$url2"
    : etc
done <products.csv

(固定报价的模数)与您的尝试非常接近。

或者切换到不太古怪的输入格式,或者使用

即时从CSV生成它。
awk -F , 'function trim (value) {
       # Trim leading and trailing double quotes
       sub(/^"/, "", value); sub(/"$/, "", value);
       return value; }
  { prod=trim($1);
    for(i=2; i<=NF; ++i) {
        # print space-separated prod, url
        print prod, trim($i) } }' products.csv |
while read -r prod url; do
    mkdir -p "$prod"
    wget -P "$prod" "$url"
done

将CSV分成重复的行,每个重复的行具有相同的产品ID和一个URL,并删除了所有CSV引号,然后循环遍历。带有mkdir选项的-p根本不介意该目录是否已存在。

答案 1 :(得分:-1)

如果您遵循@Aaron给您的良好建议,那么这段代码可以为您提供帮助,因为您似乎对bash还是陌生的,所以我注释掉了该代码以提高理解能力。

#!/bin/bash

# your csv file
myFile=products.csv

# number of lines of file
nLines=$(wc -l $myFile | awk '{print $1}')

echo "Total Lines=$nLines"

# loop over the lines of file
for i in `seq 1 $nLines`;
    do
        # first column value
        id=$(sed -n $(($i+1))p $myFile | awk -F ";" '{print $1}')

        line=$(sed -n $(($i+1))p $myFile)

        #create the folder if not exist
        mkdir $id 2>/dev/null

        # number of images in the line
        nImgs=$(($(echo $line | awk -F ";" '{print NF-1}')-1))

        # go to id folder
        cd $id
        #loop inside the line values
        for j in `seq 2 $nImgs`;
            do
                # getting the image url to download it
                img=$(echo $line | cut -d ";" -f $j)
                echo "Downloading image $img**";echo
                # downloading the image
                wget $img
        done 
        # go back path
        cd ..
done