Curl para agarrar remoto nombre de archivo después de la siguiente ubicación

Cuando la descarga de un archivo mediante el rizo, ¿cómo habría de seguir un enlace de la ubicación y el uso que de el nombre de archivo de salida (sin saber el nombre de archivo remoto en advance)?

Por ejemplo, si hace clic en el enlace de abajo, usted podría descargar un filenamed «pythoncomplete.vim.» Sin embargo el uso de curl s -O-y-L opciones, el nombre del archivo es simplemente el control remoto original-nombre, un torpe «download_script.php?src_id=10872.»

curl -O -L http://www.vim.org/scripts/download_script.php?src_id=10872

Para descargar el archivo con el nombre correcto del archivo que usted tendría que saber el nombre de el archivo de antemano:

curl -o pythoncomplete.vim -L http://www.vim.org/scripts/download_script.php?src_id=10872

Sería excelente si usted puede descargar el archivo sin conocer el nombre de antelación, y si no, hay otra forma rápida de tirar abajo un redirigido archivo a través de la línea de comandos?

InformationsquelleAutor Nick S. | 2011-07-30

7 Kommentare

  1. 144

    El lado remoto envía el nombre de archivo utilizando el encabezado Content-Disposition.

    curl 7.21.2 o más reciente lo hace automáticamente si se especifica --remote-header-name /-J.

    curl -O -J -L $url
    
    • Este no es trabajo para mí, el nombre de archivo guardadas todavía está en download_script.php?src_id=10872 formato. Estoy corriendo curl 7.30.0 en mi macbook pro
    • Funciona bien con curl 7.38.0
    • No trabajo con curl en OSX: curl 7.42.1 (x86_64-apple-darwin14.4.0) libcurl/7.42.1 SecureTransport zlib/1.2.5 libssh2/1.5.0
    • No funciona en OSX El Capitan: curl 7.43.0 (x86_64-apple-darwin15.0) libcurl/7.43.0 SecureTransport zlib/1.2.5
    • Funciona muy bien para mí en El Capitán, El mismo de la versión de la cadena. El uso de la vim.org url de arriba con -J resultados en: «curl: Guarda en archivo ‘pythoncomplete.vim'», que es como se espera. Están utilizando el sistema de curl, o algo de bebida/macports/fink @pcg?
    • Como @Diskutant «comentarios en una respuesta» a continuación. Esta falla en la curvatura en algo común en caso de Content-Disposition: attachment; filename = foo.txt. Los espacios alrededor de las = causa (véase: gist.github.com/jnewman/23c993ef50bcd69f9086fcd4e2594928)
    • En caso de que alguien más viene a través de esta opción si usted está utilizando localhost tienes que hacer es http://localhost o la -J es ignorado
    • Comando completo: curl --remote-name --remote-header-name --location $url
    • Gracias! Trabajó como un encanto en macOS 10.14.6 Catalina con curl 7.54.0 También --remote-name funcionaba perfecto en conjunción con una dirección URL que contiene un número secuencial del patrón, en mi ejemplo curl -O -J -L "http://other-domain-but-path-like-this.com/index.php?controller=attachment&id_attachment=[0-99]"

  2. 31

    Si tienes una versión reciente de curl (7.21.2 o más adelante), vea @jmanning2k la respuesta.

    I usted tiene una versión anterior de curl (como 7.19.7 que vino con Snow Leopard), hacer dos peticiones: una HEAD para obtener el nombre de archivo de encabezado de respuesta, a continuación, un GET:

    url="http://www.vim.org/scripts/download_script.php?src_id=10872"
    filename=$(curl -sI  $url | grep -o -E 'filename=.*$' | sed -e 's/filename=//')
    curl -o $filename -L $url
    
    • Gracias! Regresó con un signo de interrogación al final del nombre de archivo, así que he añadido un tr -d '\r\n' entre su grep y sed de comandos, y funcionó de maravillas.
    • En cygwin, puedo obtener un nombre de archivo llamado -L :(. He utilizado curl –remoto-encabezamiento-nombre-remoto-nombre de la URL que parecía funcionar.
    • Con curl 7.26.0 podía obtener el nombre de archivo de hacer curl -sI $url ‘ | grep -oP ‘(?<=Location: )[^\s]+’ | xargs basename.
    • La primera curl probablemente también necesite el -L opción.
    • Tuve que usar filename=$(curl -sI $url | grep -o -E 'location:.*$' | sed -e 's/location:=//' | xargs basename)
  3. 10

    Quería comentar a jmanning2k la respuesta, sino como un nuevo usuario que no puedo, así que traté de editar su post en el que está permitido, pero la edición fue rechazado diciendo que iba a ser un comentario. suspiro

    De todos modos, vea esto como un comentario a su respuesta gracias.

    Esto parece que sólo funciona si el encabezado se ve como filename=pythoncomplete.vim como en el ejemplo, pero en algunos sitios de enviar un encabezado que parece filename*=UTF-8' 'filename.zip' que uno no está reconocido por la curvatura 7.28.0

  4. 6

    Yo quería una solución que trabajó en los más mayores y los más nuevos Macs, y el código de la herencia a David para Snow Leopard no se comportan bien en virtud de los Mavericks. He aquí una función que he creado en base a David código:

    function getUriFilename() {
        header="$(curl -sI "$1" | tr -d '\r')"
    
        filename="$(echo "$header" | grep -o -E 'filename=.*$')"
        if [[ -n "$filename" ]]; then
            echo "${filename#filename=}"
            return
        fi
    
        filename="$(echo "$header" | grep -o -E 'Location:.*$')"
        if [[ -n "$filename" ]]; then
            basename "${filename#Location\:}"
            return
        fi
    
        return 1
    }
    

    Con esta definido, se puede ejecutar:

    url="http://www.vim.org/scripts/download_script.php?src_id=10872"
    filename="$(getUriFilename $url)"
    curl -L $url -o "$filename"
    
  5. 2

    Por favor, tenga en cuenta que ciertos malconfigured servidores web servirá el nombre de «nombre de archivo» como clave, donde RFC2183 especifica que debe ser «nombre de archivo». curl sólo maneja el último caso.

  6. 1

    Un ejemplo de uso de la respuesta anterior para Apache Archiva artefacto repositorio para tirar de la versión más reciente. El curl devuelve la Ubicación de la línea y el nombre del archivo al final de la línea. Necesidad de quitar el CR al final del nombre de archivo.

    url="http://archiva:8080/restServices/archivaServices/searchService/artifact?g=com.imgur.backup&a=snapshot-s3-util&v=LATEST"
    filename=$(curl --silent -sI -u user:password $url | grep Location | awk -F\/'{print $NF}' | sed 's/\r$//')
    curl --silent -o $filename -L -u user:password $url
    

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea