최종 색인을 모르는 상태에서 wget을 사용하여 다운로드


1

wget을 사용하여 일부 측정 값을 다운로드하고 있습니다.

http://www.somewhere.com/sub-somewhere052/image0001.jpg  
http://www.somewhere.com/sub-somewhere052/file0001.txt  

까지

http://www.somewhere.com/sub-somewhere052/image0099.jpg  
http://www.somewhere.com/sub-somewhere052/file0099.txt  

문제는이 두 숫자가 테스트에서 테스트로 변경된다는 것입니다 (테스트했습니다. 052 ), 각 테스트에는 알 수없는 파일이 있습니다. 그러나 그들은 모두 똑같습니다 (그들은 전화하지 않습니다. 어딘가에 , 물론) 알려져 있습니다.

wget이 더 이상 존재하지 않는 하나의 파일에 도달 할 때까지 wget을 sub-somewhere001 / image0001.jpg에서 imagexxxx.jpg (여기서 xxxx는 알 수 없음)로 "이동"시키고 파일 xxx.txt ) 어딘가에 002 / ... 등등?

즉, "더 이상 아무것도 없을 때까지"상황을 처리하는 방법은 무엇입니까?


1
아, 와우 ... 실제로 어딘가에있는 도메인이 실제로 존재합니다! ??
Rook

1
이런 경우에 example.com을 사용해야합니다. 예약 주소입니다.
Bob

@ 밥 - 그래, 글쎄 ... 요점은, 내가 믿는, 분명하고 누군가가 거기에 어딘가에 file0099.txt (아무 말장난 indended) 있는지 여부를보고 갈 의심 :
Rook

답변:


3

에서 man wget, 당신은 일반적인 유닉스 리턴 값 규칙을 사용한다는 것을 알 수 있습니다. 0은 에러가 없다는 것을 의미하고, 그 밖의 것은 에러입니다. 다른 종류의 오류 (예 : 네트워크 오류 또는 이와 유사한 문제)가 발생하지 않는다고 가정하면, 즉 파일이 없다는 것을 의미하는 내용을 다운로드하지 않으면 다음과 같이 사용할 수 있습니다.

get_tf_simulated() {
  t=$1
  if [ $t -lt 3 ]; then
    f=$3
    s=$((2 * $t))
    if [ $f -lt $s ]; then
      return 0
    fi
  fi
  return 1
}

get_tf_real() {
  tp=$2
  fp=$4
  inf=$5
  ext=$6
  # Get http://example.com/test<test number>/<image or file><file number>.<jpg or txt>
  wget -Otest$tp_file$fp_$inf.$ext http://example.com/test$tp/$inf$fp.$ext
}

get_tf() {
  echo --- Getting $*
  get_tf_simulated $*
  #get_tf_real $*
}

get_all() {
  get_tf $t $tp $f $fp image jpg
  ret_val=$?
  if [ $ret_val -ne 0 ]; then
    return $ret_val
  fi
  get_tf $t $tp $f $fp file txt
}

for t in {1..999}; do
  tp=`printf %3.3d $t`
  got_one=no
  for f in {1..9999}; do
    fp=`printf %4.4d $f`
    get_all $t $tp $f $fp
    if [ $? -ne 0 ]; then
      echo Failed, going next
      break
    fi
    got_one=yes
  done
  if [ $got_one == 'no' ]; then
    echo Nothing more
    break
  fi 
done

에서 오른쪽 줄 주석 처리 제거 get_all 기능. 현재, 그것을 시뮬 레이팅 할 것이고 아웃풋은 이렇게 될 것입니다. mkt.sh ) :

$ ./mkt.sh 
--- Getting 1 001 1 0001 image jpg
--- Getting 1 001 1 0001 file txt
--- Getting 1 001 2 0002 image jpg
Failed, going next
--- Getting 2 002 1 0001 image jpg
--- Getting 2 002 1 0001 file txt
--- Getting 2 002 2 0002 image jpg
--- Getting 2 002 2 0002 file txt
--- Getting 2 002 3 0003 image jpg
--- Getting 2 002 3 0003 file txt
--- Getting 2 002 4 0004 image jpg
Failed, going next
--- Getting 3 003 1 0001 image jpg
Failed, going next
Nothing more

노트 나는 테스트하지 않았다. wget 하나,하지만 당신은이 파일을 사용하여 테스트 할 수 있습니다 :

wget -Otest$tp_file$fp_$inf.$ext http://example.com/test$tp/$inf$fp.$ext; echo $?

그냥 바꾸십시오. $tp, $fp, $inf$ext 필요에 따라 당신이 준 것과 비슷한 예를 들면 :

wget -Otest052_file0001_file.txt http://www.example.com/sub-somewhere052/file0001.txt; echo $?

이것은 에코해야한다. 8 404에서 man wget:

8   Server issued an error response.

이것이 작동하면 스크립트가 작동해야합니다. 한 줄에 오타가 없기를 바랍니다. :)


나는 그것을 창문에 복사하려고 노력할 것이다. winxp에 wget 포트를 사용하고 있습니다. 따라서 man 페이지가 없습니다.
Rook

@Idigas : 여기, 가난한 친구, 당신만을위한 wget의 복사본. gnu.org/software/wget/manual/wget.html :)
akira

@akira - 이미 wget의 복사본이 있습니다. 내가 가지고 있지 않은 것은 * nix shell ...
Rook

@Idigas : 예, 나는 wget ..의 MANUAL을 의미하지만 나는 농담을 망쳐 놨어 :)
akira

@Idigas 설치 가능 Cygwin . 그것은 bash 쉘과 wget을 가지고 있으므로 문제없이 위의 것을 실행할 수 있어야합니다.
icyrock.com

0

사이트에서 404 응답, wget$? 변수를 0이 아닌 값 (특히 8이지만 누가 신경 쓰는지)으로 설정하십시오. 그걸 시험 할 수 있어요.

bash는 다소 혼란 스럽습니다. 파이썬 (2.7.2)에 여기 있습니다. 작동해야하지만 편리한 웹 사이트없이 직접 테스트 할 수는 없습니다. 적절한 404 응답을 리턴하는 서버에 따라 다릅니다.

#! /usr/bin/python

basepath = "http://www.somewhere.com/sub-somewhere"
imgpre = "/image"
imgpost = ".jpg"
txtpre = "/txt"
txtpost = ".txt"

import os
import urllib2

directorynum = 1
filenum = 1

while True:
    pathdir = basepath + str(directorynum).zfill(3)

    if filenum == 1:
        try:
            os.makedirs(pathdir[7:])
        except OSError, e:
            print "Error creating directory: " + e.strerror

    pathimg = pathdir + imgpre + str(filenum).zfill(4) + imgpost
    pathtxt = pathdir + txtpre + str(filenum).zfill(4) + txtpost
    try:        
        print "Getting " + pathimg
        resp = respimg = urllib2.urlopen(pathimg)
        with open(pathimg[7:], "wb") as f:
            f.write(respimg.read())

        print "Getting " + pathtxt
        resp = resptxt = urllib2.urlopen(pathtxt)
        with open(pathtxt[7:], "w") as f:
            f.write(resptxt.read())

        filenum += 1

        continue
    except urllib2.HTTPError, e:
        if e.code == 404:
            print "Error: 404"
            print "Got " + str(filenum - 1) + " from directory " + str(directorynum) + ", incrementing directory."
            directorynum += 1
            filenum = 1
            continue
        else:
            print "An unexpected error (" + resp.code + resp.msg + ") has occurred."
            break

또한 Windows에서 제대로 실행되어야합니다. #! /usr/bin/python 저장하고 .py 파일, 파이썬 인터프리터를 설치해야 함)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.