Записать вывод wget или curl в пользовательское имя файла на основе URL


12

Например, у меня есть ссылка http://www.abc.com/123/def/ghi/jkl.mno. Я хочу скачать его с помощью wgetили curlи получить имя выходного файла как def_ghi_jkl.mno, где часть def_ghiвзята по ссылке.

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

Ответы:


15

curlимеет -o, --output вариант , который принимает один аргумент , указывающий имя выходного файла должен быть записан вместо stdout. Если вы используете {}или []для окружения элементов в URL (обычно используются для извлечения нескольких документов), вы можете использовать #после числа в спецификаторе имени файла. Каждая такая переменная будет заменена соответствующей строкой для извлекаемого URL. Чтобы получить несколько файлов, добавьте разделенный запятыми список токенов внутри {}. Если части URL-адресов, которые нужно получить, являются последовательными числами, вы можете указать диапазон с помощью [].

Примеры:

  curl http://www.abc.com/123/{def}/{ghi}/{jkl}.mno -o '#1_#2_#3.mno'

Обратите внимание на кавычки вокруг аргумента опции (не требуется, если имя файла не начинается с одной из расширенных переменных). Это должно привести к выходному файлу def_ghi_jkl.mno.

  curl http://www.abc.com/123/{def}/{ghi}/{jkl,pqr,stu}.mno -o '#1_#2_#3.mno'

Это должно привести к выходным файлам def_ghi_jkl.mno, def_ghi_pqr.mnoи def_ghi_stu.mno.

 curl http://www.abc.com/123/{def}/{ghi}/[1-3].mno -o '#1_#2_#3.mno'

Это должно привести к выходным файлам def_ghi_1.mno, def_ghi_2.mno, def_ghi_3.mno.


2

wgetимеет переключатель -O(длинная форма --output-document), который позволяет указать имя файла для сохранения. (Предположительно, у curl есть нечто подобное.) Так что вы можете сделать:

wget -O def_ghi_jkl.mno http://www.abc.com/123/def/ghi/jkl.mno

и он будет делать то, что вы хотите.

Возможно, вы могли бы создать оболочку для wget, если хотите автоматизировать эту схему именования, но получить пуленепробиваемые данные будет довольно сложно, и это определенно выходит за рамки этого ответа. (Простой случай загрузки одного файла с явного URL-адреса не должен быть очень сложным для понимания, но это не единственный режим работы wget. Чтобы назвать только один случай, который делает это немного нетривиальным, вы можете указать несколько URL-адресов в командной строке.)

Обратите внимание, что -Oэто совсем не то -o, что записывает собственный вывод wget в именованный файл.


Это часть скрипта, явное указание имени файла таким образом не будет работать.
gvz

@ user47567 Почему бы и нет? А как насчет того, что wget или curl вызывается из скрипта, делает это непрактичным? (И действительно, если у вас есть такие ограничения на то, какие ответы будут работать, эта информация действительно должна идти в вопрос с самого начала.)
CVn

0

Вот какой-то трюк с заменой Баша

link="http://www.abc.com/123/def/ghi/jkl.mno"
OutputFile=$( echo ${link:23: 23}| tr "/" "_" )
echo $OutputFile
def_ghi_jkl.mno

{$link:23: 23}удалит « http://www.abc.com/123/ » это ${parameter:offset:length}, то trбудет заменить /на _.

Так что теперь вы можете легко использовать с Wget или Curl

wget $link  -O $OutputFile

Также мы можем использовать awk, это извлечет последние три поля из входной строки:

OutputFile=$( echo $link | awk -F/ 'BEGIN{OFS="_"}{ print $( NF-2),$(NF - 1 ),$NF}' )

0

wgetТребуемое имя файла не может быть получено само по себе, поэтому его необходимо обработать с помощью сценария оболочки:

$ url='http://www.example.com/123/def/ghi/jkl.mno'
$ outFile=$(echo "$url" | cut -d /  -f 5- | tr / _)
$ echo $outFile 
def_ghi_jkl.mno
$ wget "$url" -O "$outFile"

Или, если вам нравится одна строка:

wget "$url" -O "$(echo "$url" | cut -d /  -f 5- | tr / _)"

0

Если вы предпочитаете завиток, самый прямой путь:

curl -L -o <filename> "https://drive.google.com/uc?export=download&id=<file id>"

имя файла: имя загруженного файла

идентификатор файла: идентификатор файла в веб-представлении диска Google в формате https://drive.google.com/file/d/ идентификатор файла / представление

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.