Baixando alguns milhares de arquivos - como?

1

Eu quero baixar alguns milhares de arquivos um por um. O tamanho médio de cada um é 5-10Mb. Cada um tem o nome "name_ {i}", onde "i" é um contador. Qual é a maneira mais fácil e melhor de fazer isso?

Note que a conexão com a internet pode ser interrompida e eu quero interromper o processo e continuar depois. Nesses casos, da próxima vez que eu executar o script ou o que quer que ele seja, ele deverá pegar o último arquivo baixado e, se necessário, fazer o download novamente.

    
por Oskar K. 23.10.2015 / 20:10

3 respostas

3

Acredito que você pode escrever um pequeno script de shell para fazer o que quiser. Use um loop for para percorrer os arquivos, wget ou similar para baixar e gravar o arquivo atual em um arquivo a partir do qual você pode ler onde você esteve após uma interrupção.

Exemplo:

if [ -f $FILE ] count=$(cat file) for i in {$COUNT ..5} do wget https://foo.bar/name_$i echo "$i" > $FILE done else for i in {1..5} do wget https://foo.bar/name_$i echo "$i" > $FILE done fi

Essa é apenas a ideia básica, há provavelmente alguns pequenos erros, mas você tem a minha ideia, eu assumo.

    
por 23.10.2015 / 21:34
1
BASE_URL='http://some.site.somewhere.com/some/path'
LASTFILE='./countfile'
last=1
[ -e "$LASTFILE" ] && last=$(cat "$LASTFILE")

for i in $(eval {$last..1000}) ; do
   echo "$i" > "$LASTFILE"
   wget -c "$BASE_URL/name_\{$i\}"
done

Você disse que Each has a name of "name_{i}" - não tenho certeza se isso significa que o nome do arquivo tem {} chaves ou não. Caso contrário, basta remover o \{ e \} da linha wget acima.

Se os nomes dos arquivos tiverem números preenchidos com zero (por exemplo, 0005 em vez de apenas 5), você poderá usar seq em vez de eval {$last..1000} da seguinte forma:

for i in $(seq -w $last 1000); do
...
done
    
por 24.10.2015 / 00:42
0

Dê uma olhada na opção lftp do mirror :

mirror [OPTS] [source [target]]

   Mirror specified source directory to local target directory. If  the  target  directory  ends
   with  a  slash  (except the root), the source base name is appended to target directory name.
   Source and/or target can be URLs pointing to directories.

Consulte o link para obter detalhes adicionais.

EDITAR

Do manual:

lftp is a file transfer program that allows sophisticated FTP, HTTP and other connections to other hosts. If site is specified then lftp will connect to that site otherwise a connection has to be established with the open command.

   lftp  can  handle  several file access methods - FTP, FTPS, HTTP, HTTPS, HFTP, FISH, SFTP and
   file (HTTPS and FTPS are only available when  lftp  is  compiled  with  GNU  TLS  or  OpenSSL
   library).

lftp pode ser usado para obter arquivos via HTTP. Experimente:

lftp -e "mirror -c" http://url
    
por 23.10.2015 / 21:06