http 다운로드에서 와일드 카드로 wget


53

wget을 사용하여 파일을 다운로드해야하지만 파일 이름이 무엇인지 정확히 알지 못합니다.

https://foo/bar.1234.tar.gz

man page 에 따르면 wget을 사용하면 ftp 사이트를 다룰 때 글을 끌 수 있습니다.하지만 http URL이 있습니다.

wget을 사용하는 동안 와일드 카드를 사용하려면 어떻게해야합니까? gnu wget을 사용하고 있습니다.

내가 시도한 것.

/usr/local/bin/wget -r "https://foo/bar.*.tar.gz" -P /tmp

최신 정보

-A를 사용하면 서버에서 .tar.gz로 끝나는 모든 파일이 다운로드됩니다.

/usr/local/bin/wget -r "https://foo/" -P /tmp -A "bar.*.tar.gz"

최신 정보

대답에서, 이것은 결국 효과가있는 구문입니다.

/usr/local/bin/wget -r -l1 -np "https://foo" -P /tmp -A "bar*.tar.gz"

2
이것은 정확히 당신이 찾고있는 것이 아니지만 관련이 있습니다 : 컬은 기본 와일드 카드를 사용할 수 있습니다. 예 :curl "http://example.com/picture[1-10].jpg" -o "picture#1.jpg"
Hello World

1
나를 위해 하나 잡았다는했다 -e robots=off하는 매개 변수를 하지 : robots.txt에 순종 stackoverflow.com/a/11124664/1097104
Juuso Ohtonen

나는 플래그를 추가 발견 -nH하고 --cut-dirs=<number>도 유용
랜달

답변:


62

나는이 스위치들이 당신이 원하는 것을 할 것이라고 생각합니다 wget:

   -A acclist --accept acclist
   -R rejlist --reject rejlist
       Specify comma-separated lists of file name suffixes or patterns to 
       accept or reject. Note that if any of the wildcard characters, *, ?,
       [ or ], appear in an element of acclist or rejlist, it will be 
       treated as a pattern, rather than a suffix.

   --accept-regex urlregex
   --reject-regex urlregex
       Specify a regular expression to accept or reject the complete URL.

$ wget -r --no-parent -A 'bar.*.tar.gz' http://url/dir/

15

이것이 HTTP에서 직접 작동하지 않는 좋은 이유가 있으며, URL을 파일 경로 가 아니기/ 때문에 구분 기호로 사용 하면 URL 처럼 보이게 할 수 있지만 때로는 일치합니다. 1

전통적으로 (또는 역사적으로) 웹 서버는 종종 디렉토리 계층 구조를 미러하고 (예를 들어, 일부는 아파치 (Apache) – 이것은 일종의 필수 요소 임) 파일 시스템과 같은 디렉토리 인덱스를 제공합니다. 그러나 HTTP 프로토콜에 대해서는 아무것도 필요하지 않습니다.

당신의 서브 패스의 모든 것을, 말에 글로브를 적용하려면 때문에, 중요 http://foo/bar/서버는 (예를 들어, 상기 인덱스)을 제공하는 몇 가지 메커니즘을 제공하지 않는 한, 그것에게 글로브 적용 거기에 아무것도 에가 . 검색 할 파일 시스템이 없습니다. 예를 들어, 당신이 알고해서 페이지가 http://foo/bar/one.html그리고 http://foo/bar/two.html당신을 통해 파일과 하위 디렉터리 목록을 얻을 수있는 것을 의미하지 않는다 http://foo/bar/. 서버가 404를 반환하는 것은 완전히 프로토콜 내에 있습니다. 또는 파일 목록을 반환 할 수 있습니다. 또는 멋진 jpg 사진을 보낼 수도 있습니다. 기타.

따라서 여기에는 wget악용 할 수있는 표준이 없습니다 . AFAICT, wget은 각 페이지의 링크를 적극적으로 검사 하여 경로 계층 구조를 미러링합니다 . 다시 말해, 재귀 적으로 미러링 http://foo/bar/index.html하는 경우 index.html하위 경로 인 링크를 다운로드 한 다음 추출합니다. 2-A 스위치가 단순히이 방법에서 적용되는 필터이다.

간단히 말해서,이 파일들이 어딘가에 색인되어 있다는 것을 알고 있다면를 사용하여 시작할 수 있습니다 -A. 그렇지 않다면 운이 나쁘다.


1. 물론 FTP URL도 URL입니다. 그러나 FTP 프로토콜에 대해 잘 모르지만 투명 글 로빙을 허용하는 형태 일 수 있다는 것이 본성에 근거합니다.

2.이 유효한 URL이있을 수 있음을 의미 포함되지 않습니다 이 연결된 사물의 집합에 아무것도에 링크 된 방법으로하지 않기 때문에를 . 파일 시스템과 달리 웹 서버는 컨텐츠의 레이아웃을 투명하게 만들 필요가 없으며 직관적으로 명백한 방식으로 수행 할 필요도 없습니다.http://foo/bar/alt/whatever/stuff/http://foo/bar/index.html


0

위의 '-A 패턴'솔루션은 일부 웹 페이지에서 작동하지 않을 수 있습니다. 이것은 이중 해결 방법으로 내 해결 방법입니다.

  1. wget 그 페이지
  2. grep 패턴
  3. wget 파일

예 : 뉴스 팟 캐스트 페이지이고 페이지 상단에서 5 개의 mp3 파일을 원한다고 가정합니다.

wget -nv -O- https://example/page/ |
 grep -o '[^"[:space:]]*://[^"[:space:]]*pattern[^"[:space:]]*\.mp3' |
  head -n5 | while read x; do
    sleep $(($RANDOM % 5 + 5))  ## to appear gentle and polite
    wget -nv "$x"
  done

grep이중 인용 포함없는 공간 링크를 찾고 ://내 파일 이름 pattern.


RANDOM은 무엇입니까?
royki

쉘 변수는 bash매뉴얼 페이지를 참조 하십시오. RANDOM이 매개 변수를 참조 할 때마다 0에서 32767 사이의 임의의 정수가 생성됩니다.
야간 근무
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.