아래와 같이 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열(상태)에 "파일 다운로드됨"이 기록되고, 그렇지 않으면 "파일을 찾을 수 없음"이 기록됩니다.
가능합니까?
우선, 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
목록을 한 줄씩 처리합니다.
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 서버 내부 오류 등)를 쉽게 구분할 수 없습니다. 그러나 서버가 응답을 반환하지 못하면 최소한 다른 오류가 발생합니다.