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
Было бы замечательно, если бы вы могли скачать файл, не зная имя заранее, а если нет, есть ли другой способ быстро удалить перенаправленный файл через командную строку?
Ответы
Ответ 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