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?
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?
Câu trả lời:
Với GNU du
:
du -b FILE | awk '{ print $1, "* 8" }' | bc
bc
- awk
có thể tự làm toán:du -b FILE | awk '{print $1 * 8}
wc -c < FILE
tươ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)
Một giải pháp shell + GNU coreutils:
echo $(( 8 * $(stat -c%s FILE) ))
Các -c%s
tùy chọn để stat
trở 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) ))
Với GNU find
(trước GNU stat
hà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}'
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).
ZSize: 5
ví dụ
stat -c %s FILE
để in kích thước trực tiếp, thay vì sed
?
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.
a b
tệ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).
NR == 1