Gravar saída de wget ou curl em um nome de arquivo personalizado com base no URL

9

Por exemplo, eu tenho um link http://www.abc.com/123/def/ghi/jkl.mno . Eu quero baixá-lo usando wget ou curl e obter o nome do arquivo de saída como def_ghi_jkl.mno , onde a parte def_ghi é retirada do link.

Eu colocarei este comando wget em um script para fazer o download de vários arquivos para que ele não possa fornecer explicitamente o nome do arquivo de saída.

    
por gvz 20.09.2013 / 11:46

5 respostas

8

curl tem a opção -o , --output , que aceita um único argumento indicando que a saída do nome do arquivo deve ser gravada em vez de stdout . Se você estiver usando {} ou [] para envolver os elementos na URL (geralmente usada para buscar vários documentos), use # seguido por um número no especificador de nome de arquivo. Cada variável será substituída pela string correspondente para o URL que está sendo buscado. Para buscar vários arquivos, adicione uma lista separada por vírgulas de tokens dentro de {} . Se partes das URLs a serem buscadas forem números seqüenciais, você poderá especificar um intervalo com [] .

Exemplos:

  curl http://www.abc.com/123/{def}/{ghi}/{jkl}.mno -o '#1_#2_#3.mno'

Observe as aspas ao redor do argumento da opção (não necessário, a menos que o nome do arquivo comece com uma das variáveis expandidas). Isso deve resultar no arquivo de saída def_ghi_jkl.mno .

  curl http://www.abc.com/123/{def}/{ghi}/{jkl,pqr,stu}.mno -o '#1_#2_#3.mno'

Isso deve resultar nos arquivos de saída def_ghi_jkl.mno , def_ghi_pqr.mno e def_ghi_stu.mno .

 curl http://www.abc.com/123/{def}/{ghi}/[1-3].mno -o '#1_#2_#3.mno'

Isso deve resultar nos arquivos de saída def_ghi_1.mno , def_ghi_2.mno , def_ghi_3.mno .

    
por 20.09.2013 / 12:14
2

wget tem uma opção -O (formato longo --output-document ) que permite especificar o nome do arquivo no qual salvar. (Presumivelmente curl tem algo semelhante.) Então você poderia fazer:

wget -O def_ghi_jkl.mno http://www.abc.com/123/def/ghi/jkl.mno

e ele fará o que você quiser.

Provavelmente você poderia criar um wrapper em torno do wget se quiser automatizar esse esquema de nomenclatura, mas seria muito difícil obtê-lo à prova de balas e está definitivamente fora do escopo dessa resposta. (O caso simples de um único arquivo baixado de uma URL explícita não deve ser muito difícil de acertar, mas não é o único modo de operação do wget. Para nomear apenas um caso que torna isso um pouco não-trivial, você pode especificar vários URLs na linha de comando.)

Note que -O não é o mesmo que -o , que escreve a saída do próprio wget para o arquivo nomeado.

    
por 20.09.2013 / 11:54
0

Aqui está um truque de substituição do Bash

link="http://www.abc.com/123/def/ghi/jkl.mno"
OutputFile=$( echo ${link:23: 23}| tr "/" "_" )
echo $OutputFile
def_ghi_jkl.mno

{$link:23: 23} removerá " link " é ${parameter:offset:length} , então tr substituirá / por %código%.

Então agora você pode facilmente usar wget ou curl

wget $link  -O $OutputFile

Também podemos usar o awk, isso irá extrair os últimos três arquivos da string de entrada:

OutputFile=$( echo $link | awk -F/ 'BEGIN{OFS="_"}{ print $( NF-2),$(NF - 1 ),$NF}' )
    
por 20.09.2013 / 12:28
0

O nome do arquivo que você precisa não pode ser derivado por wget , então ele precisa ser removido por um script de shell:

$ url='http://www.example.com/123/def/ghi/jkl.mno'
$ outFile=$(echo "$url" | cut -d /  -f 5- | tr / _)
$ echo $outFile 
def_ghi_jkl.mno
$ wget "$url" -O "$outFile"

Ou se você gosta disso em uma linha:

wget "$url" -O "$(echo "$url" | cut -d /  -f 5- | tr / _)"
    
por 10.08.2014 / 16:46
0

Se você preferir enrolar, a maneira mais direta é:

curl -L -o <filename> "https://drive.google.com/uc?export=download&id=<file id>"

nome do arquivo: o nome do arquivo baixado

id do arquivo: o ID do arquivo na visualização da web da unidade do google no formato link ID do arquivo / view

    
por 04.04.2018 / 13:31