Làm thế nào để tìm ra một tập tin có bao nhiêu bit trong một lệnh?


9

Tôi biết tôi có thể sử dụng ls -latđể tìm ra có bao nhiêu byte có một tệp và sau đó nhân với 8 để tìm ra có bao nhiêu bit. Nhưng điều này có thể chỉ trong một dòng lệnh?


5
Tôi không nghĩ vậy. Tôi cũng không thấy bất kỳ cách sử dụng thực tế nào cho một tính năng như vậy ^^
Martin von Wittich

1
@MartinvonWittich - tốc độ internet thường được thực hiện trong ' bit mỗi giây' ...
Wilf

4
@wilf: Trừ chi phí giao thức.
Ignacio Vazquez-Abrams

Trong trường hợp của tôi, tôi đang sử dụng thử nghiệm phù hợp này: csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html và tham số là số bit tôi muốn phân tích.
Felipe

Câu trả lời:


15

Với GNU du:

du -b FILE | awk '{ print $1, "* 8" }' | bc

9
Ngoại trừ nó không cần bc- awkcó thể tự làm toán:du -b FILE | awk '{print $1 * 8}
aragaer

Cũng xem phần wc -c < FILEtương đương di động (đối với các tệp không thường xuyên, tuy nhiên, nó có tác dụng phụ khi đọc chúng)
Stéphane Chazelas

5

Một giải pháp shell + GNU coreutils:

echo $(( 8 * $(stat -c%s FILE) ))

Các -c%stùy chọn để stattrở về chỉ là kích thước tập tin theo byte, loại bỏ bất kỳ nhu cầu về xử lý văn bản bổ sung. Cú pháp này được hỗ trợ bởi lõi core GNU và do đó sẽ hoạt động theo hầu hết các bản phân phối linux.

Là một ngoại lệ trên linux, nếu một người đang chạy zsh với mô-đun zsh / stat tùy chọn, thì người ta cần chỉ định một đường dẫn để lấy lõi GNU:

echo $(( 8 * $(command stat -c%s FILE) ))

@StephaneChazelas Cảm ơn thông tin. Trả lời cập nhật.
John1024

Có vẻ như một lời giải thích tốt, cảm ơn bạn. Tuy nhiên, trong thử nghiệm của tôi, lệnh này đã trả về cho tôi: title: 7: biểu thức toán học xấu: toán hạng được mong đợi ở `% s '] 2; echo 4096000 ---- câu trả lời là 4096000, nhưng các lỗi khác là gì?
Felipe

@FelipeMicaroniLalli Tôi không thể tái tạo lỗi đó và tôi không thấy bất kỳ trường hợp nào cả (a) đưa ra thông báo lỗi đó, đồng thời, (b) đưa ra câu trả lời đúng. Tò mò.
John1024

3

Với GNU find(trước GNU stathàng thập kỷ):

find file -prune -printf '%s*8\n' | bc

Tương đối hợp lý:

ls -ld -- "$file" | awk '{print $5*8;exit}'

3

Có thể trong một dòng, bởi vì bạn có thể đặt một số lệnh trên một dòng, ví dụ: được kết nối bằng đường ống hoặc thay thế lệnh:

echo $(stat -c %s FILE) '* 8' | bc

(Cảm ơn @frostschutz đã cập nhật).


Làm việc như một cơ duyên với tôi. Stat tmp stat ngẫu nhiên-file-3 | sed -n 's / Kích thước: ([0-9] *). * / \ 1 * 8 / p' | bc ➜ 4096000
Felipe

Không hoạt động ở các địa phương không phải tiếng Anh hoặc trên các hệ thống không phải GNU hoặc cho một tệp được gọi là ZSize: 5ví dụ
Stéphane Chazelas

1
Làm thế nào stat -c %s FILEđể in kích thước trực tiếp, thay vì sed?
frostschutz

2

Tập tin duy nhất:

wc -c yourfile | awk '{print $1*8}'

Tập tin Mutipl:

wc -c yourfile1 yourfile2 | awk '{$1*=8; print $0}'

Điều này cũng làm việc cho một tập tin duy nhất. Nó không hoàn toàn chống đạn, xem bình luận của Stephane .

Đây là các lệnh tuân thủ tiêu chuẩn POSIX.


Tuyệt quá. Tuyệt vời. Tmp wc -c Random-file-1 Random-file-2 Random-file-3 | awk '{$ 1 * = 8; in $ 0} '➜ 32832 tệp ngẫu nhiên-1 ➜ 49152 tệp ngẫu nhiên-2 4096000 tệp ngẫu nhiên-3 4177984 tổng cộng
Felipe

1
Lưu ý rằng nó có tác dụng phụ nếu các tệp không phải là tệp thông thường. Cái thứ hai sẽ hiển thị một a    btệp dưới dạng a b(chuỗi các khoảng trống được chuyển đổi thành một khoảng trắng, xóa các khoảng trống theo sau).
Stéphane Chazelas

@StephaneChazelas bạn đã thử loại tệp không thường xuyên nào?
Totor

Bất kỳ loại nào (fifos, ổ cắm, cửa ra vào, thiết bị, thư mục ...). Bạn cũng sẽ gặp vấn đề với tên tệp chứa các ký tự dòng mới. Bạn có thể muốn thêm mộtNR == 1
Stéphane Chazelas
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.