내 목표: Transport Fever 2 모드 섹션에 출시된 최신 모드를 얻으려면 매일 스크립트나 명령을 실행하세요. https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/
다음은 모드의 예입니다. 다운로드할 수 있는 파일은 하단에 있습니다. https://www.transportfever.net/filebase/index.php?entry/5107-%C3%B6bb-%C3%A4ra-valousek-%C3%B6bb-1012-%C3%B6bb-1014-%C3%B6bb -1163/
wget을 시도했지만 index.php 파일만 다운로드할 수 있습니다(저는 Linux 초보자입니다).
문제는 그들이 제3자 호스트에서 파일을 호스팅한다는 것입니다.
내가 어떻게 목표를 달성할 수 있는지 아는 사람이 있나요? :)
미리 감사드립니다!
답변1
https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/최신 문서에 대한 링크를 제공합니다. 다운로드 사이트의 html 문서를 사용 curl
하고 출력을 파이프하여 다운로드 링크를 추출한 다음(아래의 쉬운 방법 수행 grep
) 명령 대체를 사용하여 이 링크를 두 번째 curl
명령에 전달할 수 있습니다.
curl -OJ \
$(curl -fs \
'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
grep -om1 '[^"]*entry-download/[^"]*')
이것이 당신에게 배울 점이 있기를 바랍니다.
grep
사용된 옵션:
-o
/--only-matching
패턴이 포함된 전체 줄이 아닌 일치하는 패턴만 출력합니다.-m 1
/--max-count=1
일치하는 항목이 포함된 첫 번째 줄 이후 입력 검색을 중지합니다.일치하는 패턴:
[^"]*entry-download/[^"]*
:다운로드 링크가 모두 제공되는 것 같습니다href="https://www.transportfever.net/filebase/index.php?entry-download/<number><...>"
. 따라서 위의 패턴 일치는 충분해 보입니다. 큰따옴표를 제외한 모든 문자가 0개 이상"
, 그 뒤에entry-download/
, 그 뒤에 큰따옴표를 제외한 모든 문자가 0개 이상 나옵니다."
curl
사용된 옵션(첫 번째 통과 - 교체 내):
-f
/--fail
하나를 받으면 아무것도 출력하지 않음4/5xx
http답장– 요청이 실패했으며 grep이 실패한 html 문서를 알려주는 것을 원하지 않습니다.-s
/--silent
이것은 첫 번째 패스이므로 진행률 표시줄 등을 보고 싶지 않습니다.
두 번째 패스 curl
옵션 - 이 다운로드 링크는 content-disposition
헤더를 사용하여 파일 이름을 알려줍니다.
-O
/--remote-name
원격 파일과 동일한 이름으로 파일을 저장합니다.-J
/ URL에서 파일 이름을 추출하는 대신 서버가 지정한 콘텐츠 처리 파일 이름을 사용하는 옵션을--remote-header-name
허용합니다 .-O
실제로 여러 개의 링크가 있습니다 entry-download/
. 링크를 모두 다운로드하려면 다음과 같이 두 번째 옵션을 제거하고 조정 -m1
하면 됩니다.grep
curl
--remote-name-all
curl --remote-name-all -J \
$(curl -fs \
'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
grep -o '[^"]*entry-download/[^"]*')
파일 충돌 확인:
content-disposition
헤더에 설명된 파일 이름을 미리 알고 싶다면 추가 단계가 필요합니다. 컬을 사용하여 head
요청을 보낼 수 있습니다 .
# get first url from the page, storing it to
# the parameter 'url' so we can use it again later
url=$(curl -fs \
'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
grep -om1 '[^" ]*entry-download/[^" ]*')
# head request to determine filename
filename=$(curl -Is "$url" | grep -iom1 '^content-disposition:.*filename="[^"]*' | grep -o '[^"]*$')
# 'if' statement using the 'test' / '[' command as the condition
if test -e "$filename"; then
echo "$filename exists!"
else
# a file named $filename doesn't exit,
# so we'll download it
curl -o "$filename" "$url"
fi
- 다음은 다운로드를 시도하기 전에 충돌하는 파일을 확인하는 간단한 예입니다.
curl -J
기존 파일을 덮어쓰지 않으므로 꼭 필요한 것은 아니지만 ,"$filename"
아마도 그렇지 않을 수도 있습니다.zip
."${filename%.zip}"
- 다른 디렉토리나 텍스트 파일에 파일이 있는지 확인하고 싶은 것 같습니다.
위 내용을 바탕으로 추출된 모든 URL에 대해 entry-download/
이 작업을 수행 하려면 다음을 수행하세요.
# extract all urls, placing them in an array parameter 'urls'
urls=( $(curl -fs \
'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
grep -o '[^" ]*entry-download/[^" ]*') )
# loop over extracted urls
for i in "${urls[@]}"; do
# do filename extraction for "$i"
# use filename to determine if you want to download "$i"
done