Подтвердить что ты не робот

Curl для захвата удаленного имени файла после следующего местоположения

При загрузке файла с использованием curl, как я буду следовать за местоположением ссылки и использовать это для имени файла вывода (не зная имя удаленного файла заранее)?

Например, если вы нажмете на ссылку ниже, вы загрузите filenamed "pythoncomplete.vim". Однако, используя параметры curl -O и -L, имя файла является просто исходным удаленным именем, неуклюжим "download_script.php? Src_id = 10872."

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

Чтобы загрузить файл с правильным именем файла, вам необходимо заранее знать имя файла:

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

Было бы замечательно, если бы вы могли скачать файл, не зная имя заранее, а если нет, есть ли другой способ быстро удалить перенаправленный файл через командную строку?

4b9b3361

Ответ 1

Если у вас есть последняя версия curl (7.21.2 или новее), см. @jmanning2k answer.

У вас есть более старая версия curl (например, 7.19.7, которая поставляется с Snow Leopard), выполните два запроса: a HEAD, чтобы получить имя файла из заголовка ответа, а затем 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

Ответ 2

Удаленная сторона отправляет имя файла с помощью заголовка Content-Disposition.

curl 7.21.2 или newer делает это автоматически, если вы укажете --remote-header-name/-J.

curl -O -J -L $url

Ответ 3

Я хотел прокомментировать ответ jmanning2k, но как новый пользователь, которого я не могу, поэтому я попытался отредактировать его сообщение, которое разрешено, но изменение было отвергнуто, сказав, что это должен быть комментарий. Вздох

В любом случае, см. это как комментарий к его ответу.

Кажется, что это работает, только если заголовок выглядит как filename=pythoncomplete.vim, как в примере, но некоторые сайты отправляют заголовок, который выглядит как filename*=UTF-8' 'filename.zip', который не распознается curl 7.28.0

Ответ 4

Мне нужно решение, которое работало как на старых, так и на новых компьютерах Mac, а унаследованный код Дэвида, предоставленный Snow Leopard, плохо вел себя под Mavericks. Здесь функция, которую я создал на основе кода Дэвида:

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
}

С учетом этого вы можете запустить:

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

Ответ 5

Обратите внимание, что определенные malconfigured webservers будут использовать имя, используя "Имя файла" в качестве ключа, где RFC2183 указывает, что он должен быть "filename". завиток обрабатывает только последний случай.

Ответ 6

Пример с использованием вышеприведенного ответа для репозитория артефактов Apache Archiva для загрузки последней версии. Curl возвращает строку Location и имя файла находится в конце строки. Необходимо удалить CR в конце имени файла.

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