list_of_urls
다음과 같다고 가정 해 보겠습니다 .
http://www.url1.com/some.txt
http://www.url2.com/video.mp4
나는 그것을 사용하는 방법을 알고 있습니다:
wget -i list_of_urls
하지만 list_of_urls
이것이 있고 모두 올바른 파일(예: PDF 또는 비디오)을 반환하면 어떻게 될까요?
http://www.url1.com/app?q=123&gibb=erish&gar=ble
http://www.url2.com/app?q=111&wha=tcha&mac=allit
단일 파일의 경우 다음과 같이 할 수 있습니다.
wget -O some.txt "http://www.url1.com/app?q=123&gibb=erish&gar=ble"
wget
이 URL 목록을 다운로드하고 반환된 데이터를 올바른 로컬 파일에 저장하려면 어떻게 해야 합니까 ?
답변1
기본적으로 wget은 전달한 URL의 마지막 구성 요소 이름을 가진 파일을 작성합니다. 많은 서버가 URL을 http://www.url1.com/app?q=123&gibb=erish&gar=ble
예쁜 파일 이름을 가진 파일로 리디렉션합니다(예: http://download.url1.com/files/something.pdf
. wget에 리디렉션 URL에 있는 이름을 사용하도록 지시할 수 있습니다 ( something.pdf
예 : 현재 디렉터리에 예측할 수 없는 파일 이름이 있지만 서버를 신뢰하거나 다음과 같은 디렉터리에서 작업하는 경우 일반적으로 올바른 선택). 다른 귀중한 파일은 포함되어 있지 않습니다.app?q=123&gibb=erish&gar=ble
--trust-server-names
--trust-server-names
일부 서버는 Content-Disposition
리디렉션 대신 헤더를 사용하여 파일 이름을 지정합니다. --content-disposition
wget이 이 파일 이름을 사용하도록 하는 옵션을 전달합니다 .
그러므로:
wget --content-disposition --trust-server-names -i list_of_urls
그래도 좋은 파일 이름을 얻지 못하면 직접 지정해야 할 수도 있습니다. 다음 줄을 포함하는 파일이 있다고 가정합니다.
http://www.url1.com/app?q=123&gibb=erish&gar=ble foo.pdf
http://www.url2.com/app?q=111&wha=tcha&mac=allit bar.txt
URL이나 파일 이름에 공백 문자가 없다고 가정하고 wget이 지정된 파일 이름으로 파일을 다운로드하도록 하려면 다음을 수행하세요.
err=0
while read -r url filename tail; do
wget -O "$filename" "$url" || err=1
done <list_of_urls_and_file_names
모든 다운로드가 성공하면 이 변수에는 0이 포함되고, 그렇지 않으면 1이 포함됩니다. 이 스니펫을 함수에 넣거나 이 스니펫을 문자열에 넣으면 괜찮습니다 err
.return $err
exit $err
URL 이외의 다른 것을 지정하고 싶지 않고 서버에서 듣기 좋은 이름을 얻을 수 없는 경우 파일 형식을 추측하고 최소한 의미가 있는 확장자를 얻으려고 노력할 수 있습니다.
err=0
n=1
while read -r url; do
if wget -O tmpfile "$url"; then
ext=data
case $(file -i tmpfile) in
application/pdf) ext=pdf;;
image/jpeg) ext=jpg;;
text/html) ext=html;;
text/*) ext=txt;;
esac
mv tmpfile "$n.$ext"
else
err=1
fi
n=$((n+1))
done
필요에 따라 다른 유형을 추가합니다. 명령 file
에 해당 옵션이 없으면 해당 -m
옵션을 그대로 두고 file
관심 있는 파일 형식에 대해 시스템에 반환되는 내용을 확인하세요. 시스템 에 파일이 있는 경우 /etc/mime.types
다음에서 MIME 유형-확장 연관을 읽을 수 있습니다.
n=1
while read -r url; do
if wget -O tmpfile "$url"; then
mime_type=$(file -m tmpfile)
ext=$(awk "$1 == \"$mime_type\" {print \$2; exit} END {print \"data\"}" /etc/mime.types)
mv tmpfile "$n.$ext"
else
err=1
fi
n=$((n+1))
done
답변2
다음과 같이 반복할 수 있습니다 list_of_urls
.
while read -r url; do
wget -O foo $url
done < list_of_urls
foo
각 항목을 결정하려면 고유한 방법을 추가해야 합니다 list_of_urls
(또한 이것이 디스크에 있는 파일이라고 가정합니다).
답변3
wget
옵션을 직접 사용할 수 있습니다 .
wget -r -i list_of_urls