Напишіть вихід 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/ ідентифікатор / view

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.