2008-09-18 31 views
14

Tôi muốn tải xuống rất nhiều url trong một tập lệnh nhưng tôi không muốn lưu các url dẫn đến lỗi HTTP.Có tùy chọn curl/wget cho biết không lưu tệp khi có lỗi http không?

Theo như tôi có thể biết từ trang của người đàn ông, không phải curl hoặc wget cung cấp chức năng như vậy. Có ai biết về một người tải xuống khác không?

+3

Theo như tôi có thể nhìn thấy Tháng Mười là người duy nhất thực sự đọc các câu hỏi và trả lời nó. Mọi người khác đã cho bạn các kỹ thuật mà sẽ * không bao giờ bao giờ * tải xuống bất cứ điều gì, hoặc họ nói để cuộn của riêng bạn. Bạn có nên chấp nhận câu trả lời * thực * duy nhất mà bạn đã đưa ra không? – iconoclast

Trả lời

13

Một lót tôi chỉ thiết lập cho mục đích này rất:

(chỉ làm việc với một tập tin duy nhất, có thể có ích cho người khác)

A=$$; (wget -q "http://foo.com/pipo.txt" -O $A.d && mv $A.d pipo.txt) || (rm $A.d; echo "Removing temp file") 

này sẽ cố gắng để tải về các tập tin từ các máy chủ từ xa. Nếu có lỗi, tệp sẽ không được lưu giữ. Trong tất cả các trường hợp khác, nó được lưu giữ và đổi tên.

+0

Bạn có ý nói "nếu có * lỗi *, tệp không được giữ"? Nếu không, bạn đã làm ngược lại với những gì được yêu cầu. – iconoclast

+0

thực sự! sẽ sửa lỗi đó :) – Oct

11

Tôi nghĩ rằng -f tùy chọn để curl làm những gì bạn muốn:

-f , --fail

(HTTP) Fail silently (no output at all) on server errors. This is mostly done to better enable scripts etc to better deal with failed attempts. In normal cases when an HTTP server fails to deliver a document, it returns an HTML document stating so (which often also describes why and more). This flag will prevent curl from outputting that and return error 22. [...]

Tuy nhiên, nếu câu trả lời là thực sự là một 301 hoặc 302 chuyển hướng, mà vẫn được lưu lại, ngay cả khi đích của nó sẽ gây ra một lỗi :

$ curl -fO http://google.com/aoeu 
$ cat aoeu 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> 
<TITLE>301 Moved</TITLE></HEAD><BODY> 
<H1>301 Moved</H1> 
The document has moved 
<A HREF="http://www.google.com/aoeu">here</A>. 
</BODY></HTML> 

để thực hiện theo chuyển hướng đến ngõ cụt của nó, cũng cung cấp cho các -L tùy chọn:

-L , --location

(HTTP/HTTPS) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response code), this option will make curl redo the request on the new place. [...]

+0

không, nó chỉ liên quan đến độ dài lỗi. khi đã sử dụng, các lỗi không được báo cáo (nhưng được lưu như bình thường) thanks anyway – akiva

+1

Đây chính xác là những gì tôi muốn ('curl -fO {URL}'). Nó không lưu một tập tin trên một '404'.Cảm ơn bạn – hypercrypt

+1

@hypercrypt Nhận xét của bạn làm tôi bối rối cho đến khi tôi nhận ra những gì đang diễn ra. Chỉnh sửa trong một cảnh báo quan trọng. – Thomas

-1

Bạn có thể tải các tập tin mà không lưu sử dụng "-O -" tùy chọn như

wget -O - http://jagor.srce.hr/ 

Bạn có thể nhận được thông tin tại mor http://www.gnu.org/software/wget/manual/wget.html#Advanced-Usage

+3

Đây là * không * những gì OP yêu cầu. Anh ta yêu cầu một cách để không tải xuống các tệp * nếu có lỗi *. Câu trả lời của bạn không tải xuống * mọi thứ, bao giờ *. – iconoclast

2

chủ đề cổ .. hạ cánh ở đây tìm kiếm một giải pháp ... đã kết thúc viết một số mã shell để làm điều đó.

if [ `curl -s -w "%{http_code}" --compress -o /tmp/something \ 
     http://example.com/my/url/` = "200" ]; then 
    echo "yay"; cp /tmp/something /path/to/destination/filename 
fi 

này sẽ tải đầu ra vào một tập tin tmp, và tạo/ghi đè lên tập tin đầu ra chỉ khi tình trạng là một 200. usecase của tôi là hơi khác nhau .. trong trường hợp của tôi đầu ra mất> 10 giây để tạo ra ... và tôi không muốn tệp đích để trống trong khoảng thời gian đó.

0

Tôi có một giải pháp để đề xuất, nó tải xuống tệp nhưng cũng xóa nó nếu kích thước của nó là 0 (điều này xảy ra nếu xảy ra 404).

wget -O <filename> <url/to/file> 
if [[ (du <filename> | cut -f 1) == 0 ]]; then 
    rm <filename>; 
fi; 

Nó hoạt động cho zsh nhưng bạn có thể điều chỉnh cho vỏ khác.

Nhưng nó chỉ lưu nó ở vị trí đầu tiên nếu bạn cung cấp tùy chọn -O

Các vấn đề liên quan