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
我正在尝试创建一个 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