Como eu posso fazer o download e extrair um arquivo usando um script (como eu posso especificar com confiabilidade o arquivo que foi baixado para um comando subseqüente)?

0

Eu quero escrever um script que baixe um arquivo de uma URL (usando wget ) e extraia esse arquivo (por exemplo, usando atool , veja aqui ).

Infelizmente, não sei onde wget salva o arquivo baixado. Meu script é parametrizado pela URL, então não sei a URL enquanto escrevo o script .

Como posso extrair um arquivo baixado por wget , se eu não souber o local que wget salva em ? Note que eu quero extrair o arquivo baixado, então a extensão do arquivo pode ser importante.

Em geral, é difícil / impossível prever o local para o qual wget será salvo. Como alguns exemplos,

  • wget example.com cria o arquivo index.html
  • A execução de wget example.com pela segunda vez cria o arquivo index.html.2
  • wget http://dis.images.s3.amazonaws.com/105024.jpeg cria o arquivo 105024.jpeg
  • wget "https://go.microsoft.com/fwlink/?LinkID=760868" cria o arquivo index.html?LinkID=760868
  • wget --content-disposition "https://go.microsoft.com/fwlink/?LinkID=760868" cria o arquivo code_1.19.1-1513676564_amd64.deb
por Peter 29.12.2017 / 21:44

2 respostas

4

Primeiro, faça wget output em um arquivo temporário. Dê uma olhada no mktemp , que permite criar um arquivo temporário de maneira segura:

[~]$ filename=$(mktemp)
[~]$ echo $filename
/tmp/tmp.DglaA1x2Z0
[~]$ wget -O $filename www.example.com
--2017-12-29 22:15:28--  http://www.example.com/
Resolving www.example.com (www.example.com)... 93.184.216.34, 2606:2800:220:1:248:1893:25c8:1946
Connecting to www.example.com (www.example.com)|93.184.216.34|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1270 (1.2K) [text/html]
Saving to: ‘/tmp/tmp.DglaA1x2Z0’

100%[======================================>] 1,270       --.-K/s   in 0s      

2017-12-29 22:15:30 (156 MB/s) - ‘/tmp/tmp.DglaA1x2Z0’ saved [1270/1270]

mktemp garante que o nome do arquivo seja exclusivo e que as permissões sejam tratadas para que não acabemos gravando em um arquivo que pertence a outro usuário. O arquivo é criado por mktemp com permissões seguras:

[~]$ ls -la $filename
-rw------- 1 vidarlo users 1270 Aug 10  2013 /tmp/tmp.DglaA1x2Z0

Desta forma, você terá um nome de arquivo que é garantido não estar em uso para qualquer coisa, e você está certo de que não estará sujeito a condições de corrida porque outro usuário o engana para escrever em um arquivo com resultados desastrosos. / p>

Agora que você tem um arquivo, com um nome de arquivo determinado, pode executar file para determinar que tipo de arquivo é:

[/tmp]$ file -i foo.tar
foo.tar: application/x-tar; charset=binary
[/tmp]$ file -i foo.7z
foo.7z: application/x-7z-compressed; charset=binary

Isso não depende do que o servidor remoto nos informa. O servidor pode informar a extensão - ou não. Um script php pode servir um arquivo tar perfeitamente válido, sem nunca dizer que é um arquivo tar.

Além disso, salvamos o conteúdo em um local seguro, evitando condições de corrida.

Suportar um grande número de formatos de arquivamento pode se tornar pesado usando essa abordagem, mas certamente é melhor do que simplesmente usar a extensão de nome de arquivo do servidor da Web, o que nos dá o arquivamento.

Note que você nunca deve parse ls , pois pode ter muitas conseqüências não intencionais.

    
por vidarlo 29.12.2017 / 22:20
0

Por padrão, wget salva no diretório . . No entanto, você pode substituir isso usando a opção -P ou --directory-prefix . Então, para salvar arquivos em /tmp/some_folder , você usaria wget ... -P tmp/some_folder ... . O "truque" é entender a terminologia correta usada (o prefixo não parece particularmente intuitivo).

Detalhes sobre o uso de wget podem ser encontrados localmente no comando man wget ou on-line aqui .

    
por richbl 29.12.2017 / 22:00