Bash脚本使用CSV下载PDF,其中包含名称和url以及自动递增名称



我正在尝试创建一个bash脚本,该脚本读取具有两列的CSV:

first column = name
second column = URL

并尝试从第二列的URL下载一个PDF文件,该文件具有带有字母和数字的随机名称.PDF,并使用第一列更改名称。

PDF名称可能重复,所以如果重复,我想添加一些数字,比如:

Example %20 $5000.pdf
Example %20 $5000.1.pdf
Example %20 $5000.2.pdf

因为如果我尝试下载wget,curl将不会使用输出选项自动递增。我尝试了很多东西,但我的局限性花费了太多时间。

我创建了一个计数器,将行号添加到末尾,但如果我得到一个更大的PDF,就会有不必要的自动递增数字。(代码如下)

应该有更好的方法,但我缺乏知识,花了太多时间。因此,如果有任何帮助,我将不胜感激,我是bash脚本的初学者。

感谢您提前提供的帮助!

CSV示例:

Example %20 $5000,HTTP://example.com/djdiede.pdf
Example %20 $5000,HTTP://example.com/djdi42322ede.pdf
Example %30 $1000,HTTP://example.com/djd4234iede.pdf
Example %50 $1000,HTTP://example.com/dj43566diede.pdf

到目前为止的代码:

#!/bin/bash -e
COUNTER=1
while IFS=, read -r field1 field2
do
COUNTER=$[$COUNTER +1]
if [ "$field1" == "" ]
then
echo "Line $COUNTER field1 is empty or no value set"
elif [ "$field2" == "" ]
then
echo "Line $COUNTER field2 is empty or no value set"
else
pdf_file=$(echo $field1 | tr '/' ' ')
echo "================================================"
echo "Downloading $COUNTER $pdf_file..."
echo "================================================"
pdf_file_test="$pdf_file.pdf"
if [ -e "$pdf_file_test" ]; then
echo -e "33[32m ^^^ File already exists!!! Adding line number at the end of the file: $pdf_file.$COUNTER.pdf 33[0m" >&2
wget -q -nc -O "$pdf_file."$COUNTER.pdf $field2
else
wget -q -nc -O "$pdf_file".pdf $field2
fi
fi
done < test.csv

这应该会有所帮助。我试着接近你自己的编码风格:

#!/bin/bash -e
LINECOUNTER=0
while IFS=, read -r field1 field2
do
LINECOUNTER=$[$LINECOUNTER +1]
if [ "$field1" == "" ]
then
echo "Line $LINECOUNTER: field1 is empty or no value set"
elif [ "$field2" == "" ]
then
echo "Line $LINECOUNTER: field2 is empty or no value set"
else
pdf_file=$(echo "$field1" | tr '/' ' ')
echo "================================================"
echo "Downloading $LINECOUNTER: $pdf_file..."
echo "================================================"
pdf_file_saveas="$pdf_file.pdf"
FILECOUNTER=0
while [ -e "$pdf_file_saveas" ]
do
FILECOUNTER=$[$FILECOUNTER +1]
pdf_file_saveas="$pdf_file.$FILECOUNTER.pdf"
done
if [ $FILECOUNTER -gt 0 ]
then
echo -e "33[32m ^^^ File already exists!!! Adding number at the end of the file: $pdf_file_saveas 33[0m" >&2
fi
wget -q -nc -O "$pdf_file_saveas" "$field2"
fi
done < test.csv

以下是我所做的:

  • 使用两个计数器:一个用于行,一个用于文件
  • 当文件已经存在时,使用文件计数器+循环查找下一个"空槽"(即不存在的名为<filename>.<counter-value>.pdf的文件)
  • 修复了错误的行号(行计数器需要从0而不是1开始)
  • 在必要/可取的地方添加双引号

如果你想进一步改进你的脚本,这里有一些建议:

  • 您可以使用if+continue,例如if [ "$field1" == "" ]; then continue; fi甚至[ "$field1" == "" ] && continue,而不是大的if ... elif ... else结构
  • 您可以在wget调用后添加错误检测和处理,而不是在出现错误时终止(#!/bin/bash -e),例如if [ $? -ne 0 ]; then echo "failed to download ..."; fi