Tôi có thể ngừng wget tạo bản sao?


13

Nếu tôi chạy wget hai lần, nó không nhận ra rằng nó đã tải xuống tệp đó và tạo một tệp mới. Có cách nào để ngăn chặn nó tải lại tập tin không?

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png.1’
...

(Rất vui khi sử dụng curl hoặc một thay thế có thể có kịch bản tương tự nếu wget không thể làm điều này.)


9
Vâng, nó tạo ra một cái mới bởi vì nó nhận ra tập tin ở đó!
nico

Câu trả lời:


17

Tôi đề nghị bạn sử dụng -Ntùy chọn.

-N
--timestamping
    Turn on time-stamping.

Nó cho phép dập thời gian, chỉ tải lại tệp nếu nó mới hơn trên máy chủ so với phiên bản đã tải xuống.

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Server file no newer than local file ‘logo.png’ -- not retrieving.

Nên biết trước (từ bình luận KasiyA của)

Nếu máy chủ không được cấu hình đúng, nó có thể luôn báo cáo rằng tệp là mới và -Nsẽ luôn tải lại tệp. Trong trường hợp này, -nccó lẽ là một lựa chọn tốt hơn.


3
Khi một máy chủ không được cấu hình đúng cách -Ncó thể bị lỗi và wget sẽ luôn tải lại. Vì vậy, đôi khi -nclà tốt hơn so với-N
αғsнιη

1
@Kasiy cảm ơn bình luận của bạn, dường như không có lựa chọn tốt cho tất cả các trường hợp.
jofel

16

Có, đó là -clựa chọn.

--continue
    Continue getting a partially-downloaded file.  This is useful when you want to
    finish up a download started by a previous instance of Wget, or by another
    program.

Nếu tệp giống nhau, lần tải xuống thứ hai sẽ dừng lại.

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
The file is already fully retrieved; nothing to do.

Hãy cẩn thận (từ ý kiến ​​của jofel)

Nếu tệp đã thay đổi trên máy chủ, -ctùy chọn có thể cho kết quả không chính xác.

Với -c, wget chỉ cần yêu cầu máy chủ cung cấp bất kỳ dữ liệu nào ngoài phần của tệp đã tải xuống, không có gì khác. Nó không kiểm tra nếu có bất kỳ thay đổi nào trong phần của tệp đã được tải xuống. Vì vậy, bạn có thể một tệp bị hỏng là hỗn hợp của tệp cũ và tệp mới.


Kiểm tra địa phương

Bạn có thể kiểm tra nó bằng cách chạy máy chủ web cục bộ đơn giản như sau (Cảm ơn câu trả lời của @roadmr ):

Mở một cửa sổ Terminal và gõ:

cd /path/to/parent-download-dir/
python -m SimpleHTTPServer

Bây giờ hãy mở Terminal khác và làm:

wget -c http://localhost:8000/filename-to-download

Lưu ý rằng đó filename-to-downloadlà tệp /path/to/parent-download-dir/mà chúng tôi muốn tải xuống.

Bây giờ nếu bạn chạy lệnh wget nhiều lần bạn sẽ thấy:

The file is already fully retrieved; nothing to do.

Ok, bây giờ hãy vào /path/to/parent-download-dir/thư mục và thêm một cái gì đó vào tệp nguồn, ví dụ nếu đó là một tệp văn bản, hãy thêm một dòng bổ sung đơn giản trong đó và lưu tệp. Bây giờ hãy thử với wget -c .... Tuyệt vời, bây giờ bạn sẽ thấy tệp tải xuống lại nhưng bạn đã tải nó trước đó.

Lý do: tại sao tải lại?

bởi vì kích thước của nó thay đổi thành kích thước lớn hơn tập tin tải xuống cũ và không có gì khác.


1
Điều này không hoạt động chính xác nếu tập tin đã thay đổi trên máy chủ giữa các lần tải xuống. Trong trường hợp xấu nhất (kích thước tệp đã tăng), bạn nhận được một tệp bị hỏng.
jofel

1
@jofel có -nckhông như bạn nói nhưng -ctùy chọn sẽ hoạt động và đó là lý do tại sao tôi đề cập đến -ctùy chọn đầu tiên.
αғsнιη

Với -c, wgetyêu cầu máy chủ cho bất kỳ dữ liệu nào ngoài một phần của tệp đã tải xuống, không có gì khác. Nó không kiểm tra nếu có bất kỳ thay đổi nào trong phần đã tải xuống của tệp trên máy chủ. Tệ nhất là bạn nhận được một tệp bị hỏng, đó là sự pha trộn giữa tệp cũ và tệp mới.
jofel

sau khi xem xét các tùy chọn Tôi nghĩ rằng điều này chỉ hữu ích cho một cái gì đó như tệp nhật ký (cập nhật gia tăng được bảo đảm), trong tất cả các trường hợp khác tôi nghĩ -N hoặc -nc phù hợp hơn khi chúng xử lý toàn bộ tệp
david.libremone

3

Ngoài ra, có một tùy chọn khác được gọi -nccho wgding:

--no-clobber
   If a file is downloaded more than once in the same directory, Wget's behavior
   depends on a few options, including -nc.  In certain cases, the local file will
   be clobbered, or overwritten, upon repeated download.  In other cases it will be
   preserved.

Khi -nctùy chọn được chỉ định, Wget sẽ từ chối tải xuống các bản sao của cùng một tệp. Nếu bạn có cùng một tệp wgetcố tải xuống, nó sẽ từ chối tải xuống trừ khi bạn đổi tên hoặc xóa tệp cục bộ.

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
File ‘logo.png’ already there; not retrieving.

Đôi khi tùy chọn này rất tốt và tôi khuyên bạn nên sử dụng -nctùy chọn thay vì cả hai -choặc -Ntùy chọn vì các tùy chọn này sẽ ghi đè tệp tải xuống bằng tệp cục bộ của bạn nếu chúng có cùng tên.

Nên biết trước (từ bình luận jofel của)

Các -nctùy chọn không cập nhật các tập tin nếu nó đã thay đổi trên máy chủ. Nếu bạn biết tập tin sẽ thay đổi, thì -Ntùy chọn là thích hợp hơn. Nếu bạn biết tập tin sẽ không thay đổi (hoặc bạn không quan tâm) thì không sao -nc.


1

Tôi biết đây là một câu hỏi cụ thể liên quan đến wget nhưng OP đã đề cập đến "Rất vui khi sử dụng curl hoặc một giải pháp thay thế có kịch bản tương tự nếu wget không thể làm điều này." Tôi không chắc yêu cầu ở đây là gì (nhiều tệp, giữ phiên bản cũ nếu khác với phiên bản gốc, thay thế bằng phiên bản mới tải xuống). Tùy thuộc vào những gì bạn muốn và cách bạn muốn xử lý các bản sao, bạn có thể cần nhiều hơn thế này .. Một cách rất đơn giản để làm những gì bạn muốn chỉ đơn giản là sử dụng curl thay thế.

curl http://cdn.sstatic.net/askubuntu/img/logo.png?v=ca4d192163aa > logo.png

Lệnh này sẽ thay thế tệp cũ bằng tệp mới được tải xuống mỗi lần.

Không xuất dữ liệu này đến thiết bị đầu cuối (không có "> [tên tệp]") nếu bạn đang tải xuống tệp nhị phân chứ không phải văn bản. Làm như vậy sẽ có khả năng gây rối với phiên cuối của bạn. Trong trường hợp bạn làm điều này một cách tình cờ, bạn có thể cần phải mở một phiên shell / terminal khác.


Nếu thiết bị đầu cuối của bạn ở dạng xấu vì bạn đã hiển thị các tệp nhị phân, có thể dễ dàng gọi chương trình "đặt lại" hơn là mở một thiết bị đầu cuối mới.
jofel

Bạn nói đúng rằng tôi không rõ ràng về yêu cầu của mình, kết quả rất vui là tôi đã tìm hiểu thêm một vài lựa chọn :) cảm ơn
david.libremone

Cảm ơn @jofel ^^ không biết về "thiết lập lại" Tôi luôn luôn đóng một tab mới và đóng cái bị cắt xén khi điều này xảy ra ... mặc dù tôi thực sự không có nó xảy ra thường xuyên.
Yêu tinh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.