所以我想将我的产品导出到我的新网站中。我有一个包含以下数据的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
答案 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