Nhận thời gian sửa đổi của tệp từ xa qua HTTP trong tập lệnh Bash


13

Tôi đang tạo một tập lệnh Bash đơn giản để trích xuất thời gian / ngày sửa đổi tệp của tệp từ xa qua HTTP.

Tệp ví dụ: http://example.com/bar/example.pdf

Điều này có thể được thực hiện mà không cần tải xuống các tập tin thực tế? Nếu không, những gì thay thế tốt nhất?

Câu trả lời:


13

Thành thật mà nói, không trực tiếp.

Bạn sẽ phải tìm nạp dữ liệu từ trang web từ xa để lấy thông tin về tệp. Thông thường, việc này được thực hiện với một HEADyêu cầu, nhưng một số máy chủ (hầu hết?) Đã không thực hiện đúng và cung cấp toàn bộ tệp, giống như thực hiện một GETyêu cầu. Giả sử rằng bạn đã curlcài đặt:

curl -s -v -X HEAD http://foo.com/bar/baz.pdf 2>&1 | grep '^< Last-Modified:'

có thể cung cấp cho bạn những gì bạn muốn, nhưng như đã nói, nó phụ thuộc rất nhiều vào máy chủ.


6
"Phần lớn"? Tôi sẽ ngạc nhiên nếu bất kỳ máy chủ HTTP phổ biến nào vi phạm giao thức theo cách như vậy.
dùng1686

Nó nên đã thay đổi tất nhiên. Thời gian trước, khi tôi xử lý những vấn đề như vậy, nó đã như thế. Tuy nhiên, thời gian trôi qua. Nếu bạn tìm thấy các trang web vẫn đang chạy cgi bất cứ "ứng dụng" nào, rất có thể chúng không xử lý HEAD. Tuy nhiên, những trang web đó cũng sẽ cung cấp cho bạn kết quả, bởi vì chúng được cho là cung cấp mọi thứ.
Karsten S.

3
Tôi đề nghị sử dụng --headtùy chọn thay vì vì -X HEADnó ngắn gọn hơn nên lệnh sẽ trở thành: curl -s -v --head http://foo.com/bar/baz.pdf 2>&1 | grep '^< Last-Modified:'
Gautham C.

1
curl -svX HEADthậm chí còn ngắn gọn hơn ...
Karsten S.

1
@ Hi-Angel Không, nói chung là không. Wget sử dụng tiêu đề If-Modified-Because để nói rằng "hey chỉ gửi tệp đó nếu nó mới hơn ngày này", sau đó đến máy chủ để thực hiện và tôn trọng tiêu đề đó. Nếu máy chủ cho rằng tệp không thay đổi, nó sẽ gửi phản hồi 304 KHÔNG ĐƯỢC SỬA ĐỔI.
antonagestam

11

Phản hồi của máy chủ thường có Last-Modifiedtrường, bạn có thể kiểm tra nó mà không cần tải xuống tệp. Không cần sử dụng -X HEAD, có một tùy chọn đặc biệt -Icho điều đó ( -sngăn chặn đầu ra tiến trình) :

curl -sI http://example.com/bar/example.pdf | grep -i Last-Modified

Ngoài ra, trong trường hợp của tôi, không có cài đặt curl (tôi đang thực hiện một kịch bản cho một thiết bị nhúng) , chỉ wget. Cách với wget là:

wget --server-response --spider http://example.com/bar/example.pdf 2>&1 | grep -i Last-Modified

Các --server-responsetiêu đề in và --spidertùy chọn buộc không tải xuống các trang, mà kiểm tra sự tồn tại của chúng.


2
Đây curllà một câu trả lời tốt hơn so với câu trả lời được chấp nhận. Có lẽ sử dụng grep -ithường xuyên "sửa đổi lần cuối" có một trường hợp khác.
not2qubit

@ not2qubit thx cho ghi chú, chỉnh sửa.
Hi-Angel
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.