Bash 使用带有名称和 url 以及自动递增名称的 CSV 下载 PDF 的脚本

Bash script to download PDF using a CSV with name and url and auto-increment name

我正在尝试创建一个 bash 脚本来读取包含两列的 CSV:

first column = name
second column = URL

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

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

Example %20 00.pdf
Example %20 00.1.pdf
Example %20 00.2.pdf

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

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

应该有更好的方法,但我的知识不足,浪费了太多时间。因此,我们将不胜感激,我是 bash 脚本的初学者。

提前感谢您的帮助!

CSV 示例:

Example %20 00,HTTP://example.com/djdiede.pdf
Example %20 00,HTTP://example.com/djdi42322ede.pdf
Example %30 00,HTTP://example.com/djd4234iede.pdf
Example %50 00,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 "3[32m ^^^ File already exists!!! Adding line number at the end of the file: $pdf_file.$COUNTER.pdf 3[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 "3[32m ^^^ File already exists!!! Adding number at the end of the file: $pdf_file_saveas 3[0m" >&2
        fi
        wget -q -nc -O "$pdf_file_saveas" "$field2"
    fi
done < test.csv

这是我所做的:

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

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

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