Điểm:0

Cách hiển thị kích thước của ổ cứng đã cài đặt

lá cờ in

Tôi muốn viết tập lệnh linux đơn giản sẽ hiển thị kích thước thực của ổ cứng đã cài đặt. Nếu có SSD 128 GB, lsblk hiển thị nhỏ hơn 128. Tôi cần kiểm tra kích thước thực của bộ nhớ và in ra như sau: Đã cài đặt 128 GB = tập lệnh cho đầu ra

128

Nếu có hai ổ cứng được cài đặt, nó sẽ cho đầu ra

128/512

Nó sẽ hoạt động trên cả ổ đĩa sata và nvme

Artur Meinild avatar
lá cờ vn
Bạn cần hiểu [sự khác biệt giữa Gigabyte và Gibibytes](https://docs.ukcloud.com/articles/other/other-ref-gib.html). Ổ cứng 128 GB là 119 GiB (Gibibyte), đây thường là thông báo của HĐH. Không rõ ý của bạn là "kích thước thực" - không có thứ gọi là "kích thước giả" AFAIK.
Grzegorz Michalak avatar
lá cờ in
Vâng, tôi biết điều đó, xin lỗi. Ý tôi là Gigabyte, kích thước "đầy đủ" của ổ cứng
Artur Meinild avatar
lá cờ vn
Kích thước đầy đủ là như nhau, cho dù bạn báo cáo ở đơn vị nào.Ngoài ra còn có các công cụ để chuyển đổi giữa [đơn vị](https://linux.die.net/man/1/units).
Grzegorz Michalak avatar
lá cờ in
Tôi hiểu rồi.. chỉ cần một lệnh để hiển thị kích thước ổ cứng tính bằng GB (không phải GiB)
Artur Meinild avatar
lá cờ vn
`lsblk -b` hiển thị kích thước theo byte - sau đó bạn có thể trích xuất và chuyển đổi theo ý thích của mình.
Grzegorz Michalak avatar
lá cờ in
Nhưng làm thế nào để chỉ trích xuất các ổ đĩa đã cài đặt?
Artur Meinild avatar
lá cờ vn
Đây là lúc kỹ năng viết kịch bản của bạn phát huy tác dụng. Tuy nhiên, có vẻ như tập lệnh của bạn sẽ không khác nhiều so với `lsblk` hoặc `df` với các tham số chính xác. Xem xét `alias dfs='\df -hl -T -x"squashfs" -x"tmpfs" | grep -v "/var/lib/docker" | (đọc h; echo "$h"; sort -V)'` được sắp xếp `df` nhưng không có ổ đĩa docker hoặc các thiết bị squashfs và tmpfs.
Điểm:1
lá cờ vn

Không rõ câu hỏi của bạn là gì. Tôi hy vọng bạn không muốn ai đó viết toàn bộ kịch bản mà thay vào đó bạn hỏi làm thế nào để có được những con số mà bạn muốn làm việc.

Sử dụng lshw, đây là đầu ra (đã được xử lý lại) từ hệ thống của tôi, một NVMe và một ổ SSD

đĩa $ lshw -c
  *-không gian tên               
       mô tả: không gian tên NVMe
       tên logic: /dev/nvme0n1
       kích thước: 953GiB (1024GB)
...
  *-đĩa
       mô tả: Đĩa ATA
       sản phẩm: SSD Samsung 850
       tên logic: /dev/sda
       kích thước: 931GiB (1TB)
...
Grzegorz Michalak avatar
lá cờ in
Vâng, lệnh của nó tốt nhưng tôi muốn nó chỉ hiển thị kích thước và nếu có thể, kích thước này trong ngoặc đơn (1TB, 1024GB, v.v.)
marosg avatar
lá cờ vn
Nó không quá phức tạp để phân tích nó và hiển thị như bạn muốn. Đừng mong đợi mọi người viết cho bạn toàn bộ kịch bản.
Điểm:1
lá cờ in
Cas

Nó yêu cầu sudo để sử dụng nhưng nó hoạt động:

sudo lshw | grep -Pzo "\*-(đĩa|không gian tên)(\n.*)+?\s+size:.*?\(\K\d+\w+" | tr "\0" "\n" | dán - sd/

Nó cho đầu ra như thế này:

1TB/750GB

Nếu không, bạn sẽ không biết liệu đó có phải là TB/GB/MB hay không, đó là lý do tại sao tôi giữ chúng.

CHỈNH SỬA: Tôi nhận thấy một .* trong regex là không cần thiết. Lệnh trên đã được cập nhật.

Giải trình:

sudo lshw: tốt ... liệt kê phần cứng. Chúng ta cần sudo để xem các ổ đĩa trong hệ thống. Đây sẽ là nguồn thông tin của chúng tôi.

grep -Pzo: chúng ta sẽ sử dụng regex để lấy thông tin cần thiết

-P = kích hoạt biểu thức chính quy Perl
-z = coi mọi thứ là một dòng dài; điều này là bắt buộc vì chúng tôi sẽ sử dụng biểu thức chính quy trên nhiều dòng
-o = thay vì hiển thị đầu ra và đánh dấu kết quả màu đỏ, chỉ hiển thị kết quả

biểu thức chính quy (mẹo: xóa -o (a.k.a -Pz) và thêm từng biểu thức chính bên dưới để xem điều gì xảy ra từng bước; văn bản màu đỏ là biểu thức chính phù hợp, vì vậy bạn có thể thấy từng bước chúng ta tiến gần hơn như thế nào đến kết quả mong muốn và mỗi bước thay đổi như thế nào đối với đầu ra):

\*-(đĩa|không gian tên) = Tìm tất cả văn bản là "*-đĩa" hoặc "*-không gian tên". Chúng tôi cần thoát (= \) "*" vì trong biểu thức chính quy, nó có nghĩa là 0 hoặc nhiều hơn, nhưng chúng tôi không muốn điều đó, chúng tôi muốn tìm kiếm một chữ "*".
(\n.*)+ = Tiếp tục thêm (dấu "+" = một hoặc nhiều) dòng ("\n" = chuyển sang dòng tiếp theo; ".*" = mọi thứ trên dòng đó) vào văn bản phù hợp; bạn sẽ thấy rằng bây giờ mọi thứ trong kết quả khớp đầu tiên của "\*-(đĩa|không gian tên)" đều có màu đỏ.
?\s+size:= chúng tôi tiếp tục thêm các dòng cho đến khi chúng tôi bắt gặp trận đấu đầu tiên ("?" = không tham lam hay còn gọi là trận đấu đầu tiên thay vì trận đấu cuối cùng) của một hoặc nhiều khoảng trắng (= "\s+"; "\ s" là khoảng trắng (tab, dấu cách, v.v.); "+" là một hoặc nhiều) và sau đó là "size:"; bạn sẽ thấy rằng nó đang tiến gần hơn đến con số mong muốn trong đầu ra.
.* = khớp với phần còn lại của dòng đó,
?\( = cho đến khi khớp đầu tiên (= ?) của "(", mà chúng ta cần thoát vì nó được sử dụng trong biểu thức chính quy (bạn có thể thấy nó được sử dụng trong phần đầu tiên của biểu thức chính quy tại đây).
\K\d+\w+ = khớp một số (= \d) một hoặc nhiều lần (= "+") và sau đó là một ký tự từ (= \w) một hoặc nhiều lần (= "+"). Bây giờ chúng tôi có văn bản phù hợp trong kết quả phù hợp, nhưng chúng tôi không muốn tất cả văn bản phù hợp trước đó trong đầu ra, vì vậy chúng tôi đặt "\K" trước văn bản mong muốn để xóa văn bản phù hợp trước "\K" khỏi đầu ra. Nó vẫn bắt buộc phải khớp, nó chỉ không được bao gồm trong đầu ra. Điều này làm cho tất cả regex trước nó trở thành một giao diện tích cực (tra cứu nó; "regex perl lookbehind tích cực") với các khả năng của regex.

tr "\0" "\n": Bạn sẽ thấy rằng chúng tôi có văn bản phù hợp mong muốn và không có gì hơn hoặc kém hơn. Khi chúng tôi thêm -o một lần nữa, bạn sẽ thấy rằng các kết quả được hiển thị theo một cách kỳ lạ (tất cả nối tiếp nhau). Đó là bởi vì chúng được phân tách bằng một ký tự rỗng (= \0) mà bạn không thể nhìn thấy, thay vì một dòng mới. Đây là một tạo tác của tùy chọn "-z" của grep. Để hiển thị chúng trong một danh sách bình thường, chúng ta sẽ thay thế các ký tự rỗng bằng một dòng mới bằng cách sử dụng tr.

dán -sd/: bây giờ chúng ta có kết quả trong một danh sách, chúng ta có thể sử dụng lệnh dán để đặt chúng sau nhau, sử dụng "/" làm bộ chia.

Cas avatar
lá cờ in
Cas
Biểu thức chính quy khá phức tạp, nhưng tôi thấy thú vị khi viết nên không có vấn đề gì.Tôi thấy buồn cười khi marosg nói về việc không muốn viết toàn bộ kịch bản trong khi tôi đã viết nó trong một ống, vì vậy đừng nghe quá nhiều những người phàn nàn như vậy, mặc dù tôi đồng ý rằng bạn nên luôn biết mình' đang làm và không chỉ sao chép trắng trợn kịch bản mà ai đó đã tạo cho bạn. Hiểu những gì nhà văn đã làm là một cách học tuyệt vời!
Grzegorz Michalak avatar
lá cờ in
Cảm ơn, thật tuyệt khi biết điều đó :) Bạn có thể mô tả mọi phần trong tập lệnh của mình đang làm gì không?
Grzegorz Michalak avatar
lá cờ in
Cảm ơn, thật tuyệt! Tôi đã sử dụng cái này ngay bây giờ: `lsscsi -s | awk '/N:/ {printf $NF}' | vòng quay | cắt -c 3- | vòng quay && lsscsi -s | awk '$3 ~ /ATA/ {printf $NF}' | vòng quay | cắt -c 3- | vòng quay `
Cas avatar
lá cờ in
Cas
Xem phần chỉnh sửa trên câu trả lời của tôi!
sudodus avatar
lá cờ jp
+1; Nhưng tôi cần tiền tố LANG=C để lệnh của bạn hoạt động, vì tôi không sử dụng tiếng Anh. Có lẽ bạn có thể chỉnh sửa câu trả lời của mình để bao gồm điều đó.
Điểm:0
lá cờ jp

Lệnh một dòng sau sẽ làm những gì bạn muốn.

cho tôi bằng $(lsblk -bdno name,size|tr -s ' ' '_'); làm j=${i##*_};j=$(((j+500000000)/1000000000));printf "${i%_*}\t$j\tGB\n";xong

Bạn có thể đặt một chức năng với nó trong ~/.bashrc tệp gần bí danh để chạy nó bằng một lệnh ngắn, chẳng hạn mydrive

function mydrives { for i in $(lsblk -bdno name,size|tr -s ' ' '_'); làm j=${i##*_};j=$(((j+500000000)/1000000000));printf "${i%_*}\t$j\tGB\n";xong }

Nó hoạt động như thế này đối với tôi, sau khi

nguồn ~/.bashrc

và trong tất cả các cửa sổ đầu cuối mà bạn mở sau khi sửa đổi ~/.bashrc tập tin.

Trong máy tính của tôi, nó in như thế này

$ mydrive
sda 256gb
sdb 4001 GB
sr0 1 GB
nvme0n1 250 GB

Tôi đã quen với GiB (gibibytes) nên tôi thường sử dụng đồng bằng lsblk chỉ huy

lsblk

hoặc khi tôi muốn biết thêm chi tiết và có một cửa sổ đầu cuối rộng

lsblk -fm

hay nói cách khác

lsblk -m

Lệnh phù hợp với những gì tôi đã gợi ý cho bạn, nhưng với mibibytes, gibibytes, tibibytes (cơ sở 2 chứ không phải cơ sở 10) sẽ là

$ lsblk -dno tên, kích thước
sda 238,5G
sdb 3,7T
sr0 1024M
nvme0n1 232,9G

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.