我有一个包含 3 列的 csv 文件,如下所示,我需要创建一个批处理文件以将 URL 中的图像从 FTP 服务器下载到文件夹,并将它们重命名为 A 列中的新名称。
New_Name,URL,Status
MyName1.jpg,ftp://images:[email protected]/images/image01.jpg,File Downloaded
MyName2.jpg,ftp://images:[email protected]/images/image02.jpg,File Downloaded
MyName3.jpg,ftp://images:[email protected]/images/image03.jpg,File Not Found
如果它能将下载状态写回 csv 文件,那就太棒了!如果文件下载成功,则会在 C 列(状态)中写入“文件已下载”,否则会写入“未找到文件”。
这可能吗?
对于初学者,我使用了以下脚本(名为 )test.sh
,在命令提示符下发出命令sh test.sh
,只是为了下载 URL,但没有任何运气!
#!/bin/sh
for link in `cat test.csv | cut -d, -f2`
do
wget $link -O /mnt/nas_1tb/a-test/
done
我从以下位置找到了上面的代码这里。
答案1
您似乎想要将该文件下载到特定目录中。您不能通过将目录名称传递给 wget 来完成此操作。要么传递完整的文件名,要么让 wget 从链接中选择名称。如果 wget 选择名称,它将文件保存在当前目录中,因此首先更改到所需的目录。
使用命令替换来解析 URL 列表是脆弱的。如果 URL 包含空格,则可能会失败;?
如果 URL 包含空格,则可能会失败。您可以使用read
逐行处理列表。
csv_file="$PWD/test.csv"
cd /mnt/nas_1tb/a-test/
while IFS=, read -r column1 url trail; do
wget "$url"
done <"$csv_file"
由于您想选择文件名,因此应该传递该-O
选项。但传递整个文件名。
要更新第三列中的下载状态,请使用更新的数据创建一个新文件。
while IFS=, read -r new_name url status; do
wget -q -O "/mnt/nas_1tb/a-test/$new_name" "$url"
case $? in
0) status='File fownloaded';;
8) status='File not found or server error';;
*) status='Download failed';;
esac
printf '%s,%s,%s\n' "$new_name" "$url" "$status"
done <test.csv >test-results.csv
请注意,wget 无法轻松区分“文件未找到”(HTTP 404) 和其他错误(例如 HTTP 403 未授权、HTTP 500 服务器内部错误等)。但当服务器无法返回响应时,您至少会收到不同的错误。