URL'ye dayalı özel bir dosya adına wget veya curl çıktısı yazın


12

Mesela bir bağlantım var http://www.abc.com/123/def/ghi/jkl.mno. Ben wgetveya kullanarak kullanarak indirmek curlve çıktı bağlantısı adını almak istiyorum def_ghi_jkl.mno, nerede def_ghibağlantı link alınır.

wgetBirden fazla dosyayı indirmek için bir komut dosyasında bu komutu koyacağım, bu nedenle çıktı dosyası adını açıkça veremiyor.

Yanıtlar:


15

curlvardır -o, --output dosya adı çıkışını gösteren tek bir argüman yerine yazılmalıdır alır seçeneği stdout. URL'deki öğeleri (veya genellikle birden fazla belge almak için kullanılır) çevrelemek için {}veya kullanıyorsanız , dosya adı belirticisinde bir sayı ve bunu []kullanabilirsiniz #. Bu tür her değişken, getirilen URL için karşılık gelen dize ile değiştirilir. Birden fazla dosya almak için simgesinin içine virgülle ayrılmış bir jeton listesi ekleyin {}. Alınacak URL'lerin bölümleri sıralı sayılarsa ile bir aralık belirleyebilirsiniz [].

Örnekler:

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

Seçenek bağımsız değişkeninin çevresindeki tırnak işaretlerini not edin (dosya adı genişletilmiş değişkenlerden biriyle başlatılmadıkça gerekmez) .Bunun çıktı dosyasıyla sonuçlanması gerekir def_ghi_jkl.mno.

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

Bu çıkış dosyalarının yol açmalıdır def_ghi_jkl.mno, def_ghi_pqr.mnove def_ghi_stu.mno.

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

Bu çıkış dosyalarının yol açmalıdır def_ghi_1.mno, def_ghi_2.mno, def_ghi_3.mno.


2

wgetkaydedilecek dosyanın adını belirlemenizi sağlayan bir anahtara -O(uzun form --output-document) sahiptir. (Muhtemelen buklede benzer bir şey vardır.) Böylece şunları yapabilirsiniz:

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

ve istediğini yapacak.

Bu adlandırma şemasını otomatikleştirmek istiyorsanız muhtemelen wget etrafında bir sarıcı oluşturabilirsiniz, ancak kurşun geçirmez hale gelmek oldukça zor olurdu ve kesinlikle bu cevabın kapsamı dışındadır. (Açık bir URL'den indirilen tek bir dosyanın basit durumunun doğru olması çok zor olmamalıdır, ancak bu wget'in tek çalışma modu değildir. Bunu biraz önemsiz yapan yalnızca bir vakayı adlandırmak için birden çok URL belirtebilirsiniz komut satırında.)

Unutmayın ki -O, -oyazmanın wget'in kendi çıktısını adlandırılmış dosyayla aynı değildir.


Bu bir komut dosyasının bir parçası, böyle çalışmaz gibi dosya adı açık bir şekilde veriyor.
gvz

@ user47567 Neden olmasın? Bir betikten wget veya curl'un çağrılması bunu pratik yapmaz hale getirir mi? (Ve gerçekten, hangi cevapların işe yarayacağına dair böyle kısıtlamalarınız varsa, bu bilgi gerçekten en başından itibaren soruya girmelidir.)
CVn

0

İşte Bash İkame hilesi

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}"kaldıracaktır http://www.abc.com/123/ " öyle ${parameter:offset:length}, o zaman tryerini alacak /için _.

Artık wget veya curl ile kolayca kullanabilirsiniz

wget $link  -O $OutputFile

Ayrıca awk kullanabiliriz, bu giriş dizesinden son üç dosya çıkarılır:

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

0

İhtiyacınız olan dosya adı wgetkendi başına türetilemez , bu nedenle bir kabuk komut dosyası tarafından ele alınması gerekir:

$ 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"

Veya bir satır olarak beğendiyseniz:

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

0

Kıvrılmayı tercih ederseniz, en doğrudan yol:

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

dosyaadı: indirilen dosyanın adı

dosya kimliği: google sürücüsünün web görünümünde https://drive.google.com/file/d/ dosya kimliği / görünümü biçimindeki dosyanın kimliği

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.