Zapisuj wyjście wget lub curl do niestandardowej nazwy pliku na podstawie adresu URL


12

Na przykład mam link http://www.abc.com/123/def/ghi/jkl.mno. Chcę go pobrać za pomocą wgetlub curli uzyskać nazwę pliku wyjściowego as def_ghi_jkl.mno, skąd część def_ghipochodzi z łącza.

Umieszczę to wgetpolecenie w skrypcie, aby pobrać wiele plików, aby nie mogło jawnie podawać nazwy pliku wyjściowego.

Odpowiedzi:


15

curlma -o, --output opcji, która przyjmuje jeden argument, wskazując wyjście Nazwa pliku powinna być zapisana zamiast stdout. Jeśli używasz {}lub []do otaczania elementów w adresie URL (zwykle używanych do pobierania wielu dokumentów), możesz użyć #znaku, a następnie numeru w specyfikatorze nazwy pliku. Każda taka zmienna zostanie zastąpiona odpowiednim ciągiem dla pobieranego adresu URL. Aby pobrać wiele plików, dodaj listę tokenów oddzieloną przecinkami {}. Jeśli części adresów URL, które mają zostać pobrane, to numery sekwencyjne, możesz określić zakres za pomocą [].

Przykłady:

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

Zwróć uwagę na cudzysłowy wokół argumentu opcji (niepotrzebne, chyba że nazwa pliku zaczyna się od jednej z rozszerzonych zmiennych). Powinno to doprowadzić do pliku wyjściowego def_ghi_jkl.mno.

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

Powinno to doprowadzić do plików wyjściowych def_ghi_jkl.mno, def_ghi_pqr.mnoa def_ghi_stu.mno.

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

Powinno to doprowadzić do plików wyjściowych def_ghi_1.mno, def_ghi_2.mno, def_ghi_3.mno.


2

wgetma przełącznik -O(długi --output-document), który pozwala określić nazwę pliku do zapisania. (Przypuszczalnie curl ma coś podobnego.) Więc możesz zrobić:

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

i zrobi to, co chcesz.

Prawdopodobnie możesz utworzyć opakowanie wokół wget, jeśli chcesz zautomatyzować ten schemat nazewnictwa, ale trudno byłoby uzyskać kuloodporny i zdecydowanie nie wchodzi w zakres tej odpowiedzi. (Prosty przypadek pojedynczego pliku pobranego z jawnego adresu URL nie powinien być bardzo trudny do prawidłowego wykonania, ale nie jest to jedyny tryb działania wget. Aby wymienić tylko jeden przypadek, który sprawia, że ​​jest to trochę trywialne, możesz podać wiele adresów URL w wierszu poleceń).

Zauważ, że -Oto wcale nie to samo -o, co własne wyjście wget zapisujące do nazwanego pliku.


Jest to część skryptu, wyraźne podanie takiej nazwy pliku nie zadziała.
gvz

@ user47567 Dlaczego nie? Co z faktu, że w skrypt wywoływany jest wget lub curl, jest to niepraktyczne? (A tak naprawdę, jeśli masz takie ograniczenia co do tego, jakie odpowiedzi będą działać, ta informacja powinna naprawdę przejść od pytania do samego początku.)
CVn

0

Oto sztuczka polegająca na zastąpieniu Basha

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}usunie „ http://www.abc.com/123/ ” to ${parameter:offset:length}, po czym trzastąpi /się _.

Teraz możesz łatwo używać wget lub curl

wget $link  -O $OutputFile

Możemy również użyć awk, to wyodrębni ostatnie trzy pola z ciągu wejściowego:

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

0

Nazwa pliku, którego potrzebujesz, nie może wgetbyć wyodrębniona sama, więc musi być sprzedawany przez skrypt powłoki:

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

Lub jeśli podoba Ci się to jako jedna linia:

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

0

Jeśli wolisz zwijanie, najbardziej bezpośrednim sposobem jest:

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

nazwa pliku: nazwa pobranego pliku

identyfikator pliku: identyfikator pliku w widoku sieciowym dysku Google w formacie https://drive.google.com/file/d/ identyfikator pliku / widok

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.