以下のように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ファイルに書き換えることができればいいと思います!ファイルのダウンロードが成功すると、列(ステータス)に「ファイルがダウンロードされました」と記録され、それ以外の場合は「ファイルが見つかりません」と記録されます。
可能ですか?
まず、URLをダウンロードするために次のスクリプト(名前付き)を使用してコマンドプロンプトでtest.sh
コマンドを実行しましたが、運がありませんでした。sh test.sh
#!/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
リストを1行ずつ処理します。
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
オプションを渡す必要があります。ただし、完全なファイル名を渡してください。
3番目の列のダウンロードステータスを更新するには、更新されたデータで新しいファイルを作成します。
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サーバー内部エラーなど)を簡単に区別することはできません。ただし、サーバーが応答を返さない場合、少なくとも他のエラーが発生します。