Curl, чтобы захватить удаленное имя файла после следующего расположения
при загрузке файла с помощью curl, как бы я следовал за местоположением ссылки и использовал его для выходного имени файла (не зная заранее удаленного имени файла)?
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
было бы отлично, если бы вы могли загрузить файл, не зная имени заранее, а если нет, есть ли другой способ быстро вытащить перенаправленный файл через командную строку?
9 ответов:
если у вас есть последние версии
curl(7.21.2 или более поздняя версия), см. @jmanning2k ответ.у вас есть более старая версия
curl(например, 7.19.7, который пришел со Снежным Барсом), сделайте два запроса: aHEADчтобы получить имя файла из заголовка ответа, затем aGET: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
удаленная сторона отправляет имя файла с помощью заголовка Content-Disposition.
curl 7.21.2 или новее делает это автоматически, если вы укажете
--remote-header-name/-J.curl -O -J -L $url
Я хотел прокомментировать ответ jmanning2k, но как новый пользователь я не могу, поэтому я попытался отредактировать его сообщение, которое разрешено, но редактирование было отклонено, сказав, что это должен быть комментарий. вздох
в любом случае, увидеть это как комментарий к его ответу, спасибо.
Это, кажется, работает только если заголовок выглядит так:
filename=pythoncomplete.vimкак в Примере, но некоторые сайты отправить заголовок, который выглядит какfilename*=UTF-8' 'filename.zip'этот не распознается curl 7.28.0
Я хотел, чтобы решение работало как на старых, так и на новых компьютерах Mac, и унаследованный код, предоставленный Дэвидом для Snow Leopard, не вел себя хорошо под Mavericks. Вот функция, которую я создал на основе кода Дэвида:
function getUriFilename() { header="$(curl -sI "" | 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"
обратите внимание, что некоторые веб-серверы malconfigured будут служить именем, используя "Filename" в качестве ключа, где RFC2183 указывает, что это должно быть "filename". curl обрабатывает только последний случай.
пример использования ответа выше для репозитория артефактов Apache Archiva для извлечения последней версии. Curl возвращает строку местоположения, а имя файла находится в конце строки. Необходимо удалить 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
вы правы. Возможно, мои провода пересеклись, читая несколько нитей. В любом случае, мой комментарий здесь неуместен.
curl -L "<URL>" -o "<WHATEVER_NAME>.<EXTENSION>"Примечание 1: двойные цитаты вокруг
URLиWHATEVER_NAME.EXTEMSIONважны.
примечание2:<EXTENSION>должны соответствует расширению загружаемого файла.
Comments