从 CSV 文件下载 url 并重命名该文件

从 CSV 文件下载 url 并重命名该文件

我有一个包含 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 服务器内部错误等)。但当服务器无法返回响应时,您至少会收到不同的错误。

相关内容