Como impedir que o cURL grave arquivos baixados

1

Estou usando

$ xargs -n 1 curl -O < gwurls.txt

para pegar uma longa lista de arquivos. Infelizmente, o site do qual estou me apropriando depende do caminho para fornecer exclusividade, portanto -O não sabe a diferença entre a/1.pdf e b/1.pdf e atrapalha o arquivo.

Existe uma maneira simples de contornar isso?

    
por PHPeer 21.03.2013 / 23:20

2 respostas

0

Algumas abordagens:

  • Do umask 222 (ou umask 277 , se o seu umask tiver atualmente 77, ou seja, adicione 200 ao seu umask). Isso fará com que todos os arquivos criados por você sejam protegidos r-- (qualquer) em vez de rw- (qualquer) , então, uma vez que você criou um arquivo, você não deve ser capaz de sobrescrevê-lo sem chmod ing primeiro (a menos que você esteja executando como root ). Isso responde à pergunta que você colocou em seu título, mas isso não resolve o seu problema; Significa apenas que você baixará e manterá com sucesso a/1.pdf e perderá b/1.pdf , e não o contrário. (Se for algum consolo, você receberá mensagens de erro alertando você sobre as colisões.)
  • O problema parece estar no seu arquivo gwurls.txt , que ingenuamente lista os dois a/1.pdf e b/1.pdf , então tente consertá-lo lá. Mangle com sed ou algo parecido com
  a/1.pdf    a_1.pdf
  b/1.pdf    b_1.pdf

… e, em seguida, escreva um script que execute curl com uma URL de $1 e uma especificação de saída de $2 e execute

  xargs -n 2your_script< modified_gwurls.txt

então xargs será executado

your_script  a/1.pdf  a_1.pdf
your_script  b/1.pdf  b_1.pdf

Isso fica confuso se algum dos nomes de arquivo tem espaço em branco neles, mas eu acho que isso não é possível para URLs, é?

    
por 22.03.2013 / 01:41
0

Wget

A solução mais fácil seria a instalação do Wget e a execução do comando a seguir:

wget --input-file=gwurls.txt

Wget automaticamente renomeia o arquivo de saída se um arquivo com o mesmo nome já existir.

Renomeando

Se você remover o esquema e o host (por exemplo, http://example.com/ ) da URL, poderá substituir todas as barras por sublinhados (ou qualquer outro caractere) e salvar os arquivos dessa maneira. Para estar no lado seguro, você pode substituir os sublinhados pré-existentes por sublinhados duplos.

Com o bash, isso deve funcionar:

while read -r URL; do
    OUTPUT="${URL#http://example.com/}"
    OUTPUT="${OUTPUT//_/__}"
    OUTPUT="${OUTPUT//\//_}"

    curl --output "$OUTPUT" --url "$URL"
done < gwurls.txt

Como funciona:

  • while read -r URL; do ... done < gwurls.txt lê o conteúdo de gwurls.txt linha por linha e armazena a linha inteira (sem espaços iniciais ou finais) na variável URL e executa ... .

  • Os três comandos OUTPUT=... executam as substituições mencionadas usando manipulação de string bash .

  • curl --output "$OUTPUT" --url "URL" baixa o arquivo e o armazena com o nome de arquivo desejado.

Estrutura de diretórios

Também é possível recriar a estrutura de diretórios do servidor usando uma abordagem semelhante.

Com o bash, isso deve funcionar:

while read -r URL; do
    OUTPUT="${URL#http://example.com/}"

    curl --create-dirs --output "$OUTPUT" --url "$URL"
done < gwurls.txt

Aqui, a opção --create-dirs faz o cURL criar o diretório a se OUTPUT ler a/1.pdf .

    
por 22.03.2013 / 03:38