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 "пройти" sub -where001/image0001.jpg в imagexxxx.jpg (где xxxx неизвестно), пока он не достигнет одного файла, который больше не существует, а затем перейти к (после файлаxxxx.txt ) куда-то002/... и так далее?

Короче, как бороться с ситуацией "иди, пока больше ничего"?

2 ответа2

3

Из man wget видно, что он использует обычное соглашение о возвращаемом значении Unix - 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.

Если это работает, то сценарий должен работать, надеюсь, что в этой строке нет опечаток. :)

0

Если сайт возвращает ответ 404 , wget установит $? переменная к ненулевому значению (конкретно 8, но кого это волнует). Вы можете проверить это.

Я нахожу Bash довольно запутанным, поэтому вот один из них в Python (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 , хотя должен быть установлен интерпретатор python)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .