Mam listę adresów URL w pliku o nazwie urls.txt
. Każda linia zawiera 1 adres URL. Chcę pobrać wszystkie pliki naraz, używając cURL. Wydaje się, że nie mogę zejść z właściwą linijką.
Próbowałem:
$ cat urls.txt | xargs -0 curl -O
Ale to daje mi tylko ostatni plik na liście.
for i in $(cat urls.txt) ; do curl -O $i ; done
tr
for i in $(cat urls.txt) ; do curl -O $(echo $i | tr '\r' ' ') ; done
Odpowiedzi:
To działa dla mnie:
Jestem we FreeBSD. Twoje xargs mogą działać inaczej.
Zauważ, że działa to sekwencyjnie
curl
, które możesz uznać za niepotrzebnie ciężkie. Jeśli chcesz zaoszczędzić trochę tego narzutu, poniższe mogą działać w bashu:Spowoduje to zapisanie listy adresów URL w tablicy, a następnie rozszerzenie tablicy z opcjami,
curl
aby spowodować pobranie celów.curl
Komenda może trwać wiele adresów URL i pobrać wszystkie z nich, recykling istniejącego połączenia (HTTP / 1.1), ale potrzebuje-O
opcji przed każdym z nich, aby pobrać i zapisać każdy cel. Zwróć uwagę, że znaki w niektórych adresach URL] mogą wymagać zmiany znaczenia, aby uniknąć interakcji z powłoką.Lub jeśli używasz powłoki POSIX zamiast bash:
Zależy to od
printf
zachowania polegającego na powtarzaniu wzorca formatu w celu wyczerpania listy argumentów danych; nie wszystkie samodzielne komputeryprintf
to zrobią.Zwróć uwagę, że ta metoda inna niż xargs może również wpływać na ograniczenia systemu w przypadku bardzo dużych list adresów URL. Badania ARG_MAX i MAX_ARG_STRLEN jeśli jest to problemem.
źródło
-L
grę wchodziło przekierowanie, więc musiałem dodać opcję docurl
.cat urls.txt | xargs -n 1 curl -O
;-)\r
w systemie Windows i nie podobały mi się znaki w pliku tekstowym.Bardzo proste rozwiązanie byłoby następujące: Jeśli masz plik „file.txt” taki jak
Następnie możesz użyć curl i po prostu to zrobić
A curl będzie wywoływać wszystkie adresy URL zawarte w pliku file.txt!
Więc jeśli masz kontrolę nad formatem pliku wejściowego, być może jest to najprostsze rozwiązanie dla Ciebie!
źródło
Lub możesz po prostu zrobić to:
Tego
-I
parametru potrzebujesz tylko wtedy, gdy chcesz wstawić wyjście cat w środku polecenia.źródło
-o
Rozwiązaniem dla zwinięcie określa plik wyjściowy jako argument. Zalecane są inne odpowiedzi-O
, które nakazują programowi curl określenie lokalnej nazwy na podstawie zdalnej nazwy pliku.xargs -P 10 | curl
GNU
xargs -P
możecurl
równolegle uruchamiać wiele procesów. Np. Do uruchamiania10
procesów:Spowoduje to 10-krotne przyspieszenie pobierania, jeśli maksymalna prędkość pobierania nie zostanie osiągnięta i jeśli serwer nie ogranicza adresów IP, co jest najczęstszym scenariuszem.
Po prostu nie ustawiaj
-P
zbyt wysoko, bo twoja pamięć RAM może być przeciążona.GNU
parallel
może osiągnąć podobne rezultaty.Wadą tych metod jest to, że nie używają one jednego połączenia dla wszystkich plików, co
curl
dzieje się, jeśli przekażesz do niego wiele adresów URL jednocześnie, jak w:jak wspomniano na /server/199434/how-do-i-make-curl-use-keepalive-from-the-command-line
Może połączenie obu metod dałoby najlepsze rezultaty? Ale wyobrażam sobie, że równoległość jest ważniejsza niż utrzymanie połączenia.
Zobacz też: Pobieranie równoległe za pomocą narzędzia wiersza poleceń Curl
źródło
Oto jak to robię na Macu (OSX), ale powinno działać równie dobrze na innych systemach:
Potrzebujesz pliku tekstowego zawierającego linki do curl
tak jak:
W tym hipotetycznym przypadku plik tekstowy ma 3287 linii, a każda linia koduje 15 obrazów.
Powiedzmy, że zapisujemy te linki w pliku tekstowym o nazwie testcurl.txt na najwyższym poziomie (/) naszego dysku twardego.
Teraz musimy wejść do terminala i wprowadzić następujące polecenie w powłoce bash:
Upewnij się, że używasz back ticków (`) Upewnij się także, że flaga (-O) jest wielką literą O a NIE zerem
z flagą -O zostanie przyjęta oryginalna nazwa pliku
Miłego pobierania!
źródło
echo ";sudo rm -rf ~/" >> testcurl.txt
i zobacz, co się stanie.Jak słusznie wspomnieli inni:
Jednak ten paradygmat jest bardzo złym pomysłem, zwłaszcza jeśli wszystkie adresy URL pochodzą z tego samego serwera - nie tylko utworzysz kolejną instancję curl, ale także utworzysz nowe połączenie TCP dla każdego żądania, które jest wysoce nieefektywny, a tym bardziej w przypadku wszechobecnego HTTPS.
Użyj tego zamiast tego:
Lub jeszcze prościej:
Najprostsze jeszcze:
źródło
-i-
w odniesieniu do stdin. To znaczy:wget -i- < urls.txt
Na koniec, jeśli chceszcurl
zażądać wielu adresów URL na raz, bez konieczności odradzania się, zawsze możesz po prostu umieścić je w wierszu poleceń.xargs curl < urls.txt
robi to, używając protokołu HTTP / 1.1. Liczba adresów URL jest ograniczona długością wiersza poleceń, które xargs może przetworzyć. Dowiedz się tego limitu zgetconf ARG_MAX
.