我正在嘗試創建一個 bash 腳本,該腳本讀取包含兩列的 CSV:
first column = name
second column = URL
并嘗試從第二列的 URL 下載一個帶有字母和數字的隨機名稱 .pdf 的 PDF 檔案,并使用第一列更改名稱。
PDF 名稱可能重復,因此如果重復,我想添加如下數字:
Example $5000.pdf
Example $5000.1.pdf
Example $5000.2.pdf
因為如果我嘗試下載 wget 并且 curl 將不會使用輸出選項自動遞增。我嘗試了很多東西,但我的限制花費了太多時間。
我創建了一個將行號添加到末尾的計數器,但是如果我得到一個更大的 PDF,將會有不必要的自動遞增數字。(代碼如下)
應該有更好的方法,但我缺乏知識花費了太多時間。因此,我將非常感謝您對此的任何幫助,我是 bash 腳本的初學者。
提前感謝您的任何幫助!
CSV 示例:
Example $5000,HTTP://example.com/djdiede.pdf
Example $5000,HTTP://example.com/djdi42322ede.pdf
Example 0 $1000,HTTP://example.com/djd4234iede.pdf
Example P $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 "\033[32m ^^^ File already exists!!! Adding line number at the end of the file: $pdf_file.$COUNTER.pdf \033[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
uj5u.com熱心網友回復:
這應該有幫助。我試圖接近你自己的編碼風格:
#!/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 "\033[32m ^^^ File already exists!!! Adding number at the end of the file: $pdf_file_saveas \033[0m" >&2
fi
wget -q -nc -O "$pdf_file_saveas" "$field2"
fi
done < test.csv
這是我所做的:
- 使用兩個計數器:一個用于行,一個用于檔案
- 當檔案已經存在時,使用檔案計數器 回圈查找下一個“空槽”(即
<filename>.<counter-value>.pdf不存在的檔案名) - 修復了錯誤的行號(行計數器需要從 0 而不是 1 開始)
- 在必要/建議時添加雙引號
如果你想進一步改進你的腳本,這里有一些建議:
- 而不是大
if ... elif ... else結構,你可以使用ifcontinue,例如if [ "$field1" == "" ]; then continue; fi甚至[ "$field1" == "" ] && continue #!/bin/bash -e您可以在wget呼叫后添加錯誤檢測和處理,而不是在錯誤 ( )上終止,例如if [ $? -ne 0 ]; then echo "failed to download ..."; fi
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/321147.html
