Có cách nào để lấy kích thước của tệp từ xa như
http://api.twitter.com/1/statuses/public_timeline.json
trong tập lệnh shell?
Có cách nào để lấy kích thước của tệp từ xa như
http://api.twitter.com/1/statuses/public_timeline.json
trong tập lệnh shell?
wget --spider
?
Câu trả lời:
Bạn có thể tải xuống tệp và lấy kích thước của nó. Nhưng chúng ta có thể làm tốt hơn.
Sử dụng curl để chỉ nhận tiêu đề phản hồi bằng cách sử dụng -I
tùy chọn.
Trong tiêu đề phản hồi, tìm kiếm Content-Length:
sẽ được theo sau là kích thước của tệp tính bằng byte.
$ URL="http://api.twitter.com/1/statuses/public_timeline.json"
$ curl -sI $URL | grep -i Content-Length
Content-Length: 134
Để có được kích thước, hãy sử dụng bộ lọc để trích xuất phần số từ đầu ra ở trên:
$ curl -sI $URL | grep -i Content-Length | awk '{print $2}'
134
tr -d '\r'
để loại bỏ chúng.
curl -sI $URL | grep -i content-length
để tránh trường hợp nhạy cảm, bạn phải sử dụng -i
trong grep
curl -sI https://code.jquery.com/jquery-3.1.1.min.js | grep -i content-length
Hai lưu ý cho các câu trả lời khác:
Ngoài ra, bạn có thể làm điều này mà không cần grep / awk hoặc piping:
curl 'http://api.twitter.com/1/statuses/public_timeline.json' --location --silent --write-out 'size_download=%{size_download}\n' --output /dev/null
Và yêu cầu tương tự với nén:
curl 'http://api.twitter.com/1/statuses/public_timeline.json' --location --silent -H 'Accept-Encoding: gzip,deflate' --write-out 'size_download=%{size_download}\n' --output /dev/null
-L
vào lệnh để theo dõi chuyển hướng (Tôi không có URL chuyển hướng tiện dụng để kiểm tra). Và, có, nó tải xuống toàn bộ tệp.
Content-Length
một HEAD
yêu cầu chính xác , bạn không cần phải tải xuống toàn bộ tệp. Chỉ cần thêm -I
vào ví dụ trên để xem nó trả về 0 như thế nào (ít nhất là vào ngày 25 tháng 2 năm 2019). Giải pháp của tôi là khái quát hơn.
Tương tự như câu trả lời của codaddict , nhưng không có lệnh gọi đến grep
:
curl -sI http://api.twitter.com/1/statuses/public_timeline.json | awk '/Content-Length/ { print $2 }'
content-length
làm hỏng lệnh của bạn. Có rất nhiều cách để bỏ qua trường hợp trong awk, nhưng đây là đạn nhất: curl -sI http://api.twitter.com/1/statuses/public_timeline.json | awk '/[Cc]ontent-[Ll]ength/ { print $2 }'
... tất nhiên grep cũng là tốt đẹp;)
Các câu trả lời trước sẽ không hoạt động khi có chuyển hướng. Ví dụ, nếu một người muốn kích thước của đĩa DVD debian iso, anh ta phải sử dụng tùy chọn --location, nếu không, kích thước được báo cáo có thể là kích thước của phần 302 Moved Temporarily
trả lời, không phải của tệp thực.
Giả sử bạn có url sau:
$ url=http://cdimage.debian.org/debian-cd/8.1.0/amd64/iso-dvd/debian-8.1.0-amd64-DVD-1.iso
Với curl, bạn có thể có được:
$ curl --head --location ${url}
HTTP/1.0 302 Moved Temporarily
...
Content-Type: text/html; charset=iso-8859-1
...
HTTP/1.0 200 OK
...
Content-Length: 3994091520
...
Content-Type: application/x-iso9660-image
...
Đó là lý do tại sao tôi thích sử dụng hơn HEAD
, đây là một bí danh cho lwp-request
lệnh từ gói libwww-perl (trên debian). Một ưu điểm khác của nó là nó loại bỏ các ký tự \ r thừa , giúp giảm bớt quá trình xử lý chuỗi tiếp theo.
Vì vậy, để truy xuất kích thước của đĩa DVD debian iso, người ta có thể làm ví dụ:
$ size=$(HEAD ${url})
$ size=${size##*Content-Length: }
$ size=${size%%[[:space:]]*}
Xin lưu ý rằng:
Đối với các shell khác, bạn có thể phải dùng đến sed, awk, grep và cộng sự.
sử dụng cURL để chạy ở chế độ im lặng -s
,
chỉ kéo các tiêu đề -I
(để tránh tải xuống toàn bộ tệp)
sau đó thực hiện một grep không phân biệt chữ hoa chữ thường -i
và trả về đối số thứ hai bằng awk $2
.
đầu ra được trả lại dưới dạng bytes
curl -sI http://api.twitter.com/1/statuses/public_timeline.json | grep -i content-length | awk '{print $2}'
//output: 52
hoặc là
curl -sI https://code.jquery.com/jquery-3.1.1.min.js | grep -i content-length | awk '{print $2}'
//output: 86709
hoặc là
curl -sI http://download.thinkbroadband.com/1GB.zip | grep -i content-length | awk '{print $2}'
//output: 1073741824
Nếu bạn muốn hiển thị kích thước bằng Kilobyte thì hãy thay đổi awk thành:
awk '{print $2/1024}'
hoặc Megabyte
awk '{print $2/1024/1024}'
Giải pháp được chấp nhận không hoạt động đối với tôi, đây là:
curl -s https://code.jquery.com/jquery-3.1.1.min.js | wc -c
wc
.
Tôi có một hàm shell, dựa trên câu trả lời của codaddict , cung cấp kích thước tệp từ xa ở định dạng con người có thể đọc được do đó:
remote_file_size () {
printf "%q" "$*" |
xargs curl -sI |
grep Content-Length |
awk '{print $2}' |
tr -d '\040\011\012\015' |
gnumfmt --to=iec-i --suffix=B # the `g' prefix on `numfmt' is only for systems
# ^ # that lack the GNU coreutils by default, i.e.,
# | # non-Linux systems
# |
# | # in other words, if you're on Linux, remove this
# | # letter `g'; if you're on BSD or Mac, install the GNU coreutils
} # | |
# +----------------------------------------+
Để kết hợp tất cả các công việc trên cho tôi:
URL="http://cdimage.debian.org/debian-cd/current/i386/iso-dvd/debian-9.5.0-i386-DVD-1.iso"
curl --head --silent --location "$URL" | grep -i "content-length:" | tr -d " \t" | cut -d ':' -f 2
Điều này sẽ chỉ trả về độ dài nội dung tính bằng byte:
3767500800
Tôi sử dụng như thế này ([Cc]ontent-[Ll]ength:)
, vì tôi nhận được máy chủ cung cấp nhiều ký tự Độ dài Nội dung ở phản hồi tiêu đề
curl -sI "http://someserver.com/hls/125454.ts" | grep [Cc]ontent-[Ll]ength: | awk '{ print $2 }'
Accept-Ranges: bytes
Access-Control-Expose-Headers: Date, Server, Content-Type, Content-Length
Server: WowzaStreamingEngine/4.5.0
Cache-Control: no-cache
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: OPTIONS, GET, POST, HEAD
Access-Control-Allow-Headers: Content-Type, User-Agent, If-Modified-Since, Cache-Control, Range
Date: Tue, 10 Jan 2017 01:56:08 GMT
Content-Type: video/MP2T
Content-Length: 666460
$ curl -O -w 'We downloaded %{size_download} bytes\n'
https://cmake.org/files/v3.8/cmake-3.8.2.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 7328k 100 7328k 0 0 244k 0 0:00:29 0:00:29 --:--:-- 365k
We downloaded 7504706 bytes
Đối với các mục đích tự động, bạn chỉ cần thêm lệnh vào tệp script của mình.
giải pháp khác nhau:
ssh userName@IP ls -s PATH | grep FILENAME | awk '{print$1}'
cung cấp cho bạn kích thước tính bằng KB