Làm thế nào tôi có thể có được kích thước của stdin?


8

Tôi sắp nén một thư mục lớn và tôi muốn biết chính xác, tệp kết quả sẽ lớn đến mức nào.

Tôi đã thử sử dụng du:

$ tar -cv dir | du -h -
du: cannot access '-': No such file or directory

Sau đó, tôi đã thử sử dụng phiên bản tệp của '-':

$ tar -cv dir | du -h /dev/stdin
1.0K

Tôi chắc chắn con số này không chính xác. Làm thế nào tôi có thể có được kích thước của stdin?

Câu trả lời:


10

tl; dr :tar -cv dir | wc -c - | cut -d' ' -f 1 | awk '{print $1/1000"K"}'

dukhông thực sự đếm kích thước của tập tin. Nó chỉ yêu cầu kernel truy vấn hệ thống tập tin, đã theo dõi kích thước tập tin. Đây là lý do tại sao nó rất nhanh. Do đó, và thực tế là bạn đang đếm một luồng chứ không phải tệp, dukhông hoạt động. Tôi đoán đó 1.0Klà một kích thước mã hóa cứng /dev/std*trong kernel.

Giải pháp là sử dụng wc -c, nó tự đếm byte thay vì truy vấn kernel:

$ tar -cv dir | wc -c

Nếu bạn muốn đầu ra tương tự như du -h:

$ tar -cv dir | wc -c | awk '{print $1/1000"K"}'

Số awkbiến thành một kết quả có thể đọc được của con người.


8
Lưu ý rằng nếu bạn bỏ qua phần wcthừa -thì bạn cũng không cần cutlệnh tiếp theo .
Janis

1
1,0K là kích thước khối của stdin.
Cody Allan Taylor

6

Với GNU tarbạn chỉ có thể làm:

tar --totals -c . >/dev/null

... sẽ hiển thị đầu ra như ...

Total bytes written: 5990400 (5.8MiB, 5.5GiB/s)

... trên thiết bị lỗi thời. Tương tự, với bất kỳ tar (hoặc luồng) nào bạn có thể sử dụng ddđể phân phối báo cáo về số byte. Điều này có thể hoặc không thích hợp hơn wc, nhưng ddmặc định là kích thước khối 512 byte - giống hệt với tarkích thước khối. Nếu PIPE_BUF của hệ thống của bạn đủ lớn, bạn thậm chí có thể mở rộng ddkích thước khối để phù hợp với tarkích thước bản ghi của nó - là 20 khối hoặc 10240 byte. Như thế này:

tar -c . | dd bs=bx20 >/dev/null
585+0 records in
585+0 records out
5990400 bytes (6.0 MB) copied, 0.0085661 s, 699 MB/s

Điều này có thể hoặc không thể cung cấp một giải pháp hiệu quả hơn wc.

Trong cả hai ddtarsử dụng-trường hợp, bạn không cần phải thực sự định đoạt của con suối, mặc dù. Tôi chuyển hướng đến /dev/nullphía trên - nhưng tôi có thể dễ dàng chuyển hướng đến một số tệp và vẫn nhận được báo cáo về kích thước của nó tại thời điểm nó được viết.


Trong trường hợp tệp được ghi vào đĩa, sẽ không có cách sử dụng để xác định kích thước riêng vì thông tin đó được lưu trữ cùng với tệp. (+1) cho mức tăng hiệu suất dự kiến ​​của dd(so với wc).
Janis

1
@Janis - có thể đúng trong trường hợp đơn giản nhất - nhưng hãy tưởng tượng rằng ddđầu ra của nó được truyền lại - cho một máy nén, và vì bất kỳ lý do gì bạn thấy muốn biết cả kích thước thô của kho lưu trữ và nén. Cũng hữu ích là để có được một báo cáo tức thì về số lượng hồ sơ - tarkhông chỉ là một kho lưu trữ, mà là một định dạng luồng. Nó có thể được sử dụng theo những cách khác ngoài việc chỉ lưu vào một nhóm các tệp vào một số tệp khác. Nó thường hữu ích để chặn một luồng trước khi sửa đổi nó. Tại mỗi ranh giới kỷ lục đó là cả một khối NUL.
mikeerv

5

Tôi muốn đề xuất:

tar cf - dir | wc -c

Một đơn giản c(không cần dẫn đầu -) được sử dụng để tạo một tarkho lưu trữ, fchỉ định một tệp đầu ra và -biểu thị rằng nó là thiết bị xuất chuẩn . (Lưu ý rằng nếu bạn muốn chỉ là kích thước và có rất nhiều tác phẩm dưới dir bạn có thể thay omit tar's vvì lý do hiệu suất.)


@mikeerv; Tôi dường như nhớ lại rằng tôi đã làm việc với tars trong quá khứ nơi chỉ định tệp tar (do đó f-) là bắt buộc. - Chỉ cần nhìn nó lên; mà không cần f -các targiả định /etc/mt0như mặc định.
Janis

1
Tôi đã tìm nó trong một cuốn sách mà tôi đã sử dụng như một hướng dẫn sử dụng vào thời điểm đó và tôi nghĩ rằng nó dựa trên SysV R4. Rất ít người chắc chắn nhớ lại ý /etc/mt0nghĩa thực sự của nó - "băng từ" ;-) Tôi sẽ quan tâm đến cách tarhành xử của Solaris (vì Solaris là một trong những HĐH đương đại được biết là vẫn còn những thứ thực sự cũ /bin).
Janis

@mikeerv; PS: Cuốn sách đề cập đến "Hướng dẫn lập trình UNIX cho các tập 1, 2A, 2B" của AT & T (nhưng không có ngày phát hành thủ công hoặc phiên bản phát hành UNIX, nhưng phải có từ đầu những năm 1980, 1983, hoặc hơn thế).
Janis

Bạn đã bao giờ nhìn thấy điều này ? Không liên quan - nhưng tôi chỉ tìm thấy nó ngày hôm nay, và nghĩ rằng bạn có thể thích nó.
mikeerv

Tôi không hiểu câu trả lời này khác với tôi như thế nào. Có phải là sự hiện diện của -fcờ tar?
strugee

1

Các từ ngữ của câu hỏi của bạn cho vay tar ... | wc -ccâu trả lời ở trên. Ban đầu tôi đã đọc câu hỏi của bạn với một giả định im lặng rằng bạn muốn báo cáo kích thước trong khi nó đang tạo tệp tar (có lẽ đầu ra của tar sau đó được dẫn qua một liên kết mạng?).

Trong trường hợp đó, tôi đề nghị pv- người xem ống. Tôi đã thấy tham chiếu đến nó nhưng chưa có cơ hội để chơi với nó.

Người giới thiệu

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.