Score:0

วิธีแสดงขนาดของฮาร์ดไดรฟ์ที่ติดตั้ง

ธง in

ฉันต้องการเขียนสคริปต์ลินุกซ์อย่างง่ายซึ่งจะแสดงขนาดที่แท้จริงของฮาร์ดไดรฟ์ที่ติดตั้งไว้ หากมี 128GB SSD lsblk แสดงน้อยกว่า 128 ฉันต้องตรวจสอบขนาดจริงของหน่วยความจำและพิมพ์ดังนี้: ติดตั้ง 128GB = สคริปต์ให้เอาต์พุต

128

หากมีการติดตั้งฮาร์ดไดรฟ์สองตัว มันจะให้เอาต์พุต

128/512

ควรใช้งานได้ทั้งไดรฟ์ sata และ nvme

Artur Meinild avatar
vn flag
คุณต้องเข้าใจ[ความแตกต่างระหว่าง Gigabytes และ Gibibytes](https://docs.ukcloud.com/articles/other/other-ref-gib.html) ฮาร์ดไดรฟ์ขนาด 128 GB คือ 119 GiB (Gibibytes) ซึ่งโดยปกติแล้วเป็นสิ่งที่ระบบปฏิบัติการรายงาน ยังไม่ชัดเจนว่าคุณหมายถึงอะไรโดย "ขนาดจริง" - ไม่มีสิ่งที่เรียกว่า "ขนาดปลอม" AFAIK
Grzegorz Michalak avatar
in flag
ใช่ ฉันรู้ ขอโทษ ฉันหมายถึง Gigabytes ขนาด "เต็ม" ของฮาร์ดไดรฟ์
Artur Meinild avatar
vn flag
ขนาดเต็มเท่ากันไม่ว่าคุณจะรายงานในหน่วยใดนอกจากนี้ยังมีเครื่องมือในการแปลงระหว่าง [หน่วย](https://linux.die.net/man/1/units)
Grzegorz Michalak avatar
in flag
ฉันเข้าใจแล้ว .. แค่ต้องการคำสั่งให้แสดงขนาดฮาร์ดไดรฟ์เป็น GB (ไม่ใช่ GiB)
Artur Meinild avatar
vn flag
`lsblk -b` แสดงขนาดเป็นไบต์ - ซึ่งคุณสามารถแยกและแปลงตามที่คุณต้องการได้
Grzegorz Michalak avatar
in flag
แต่จะแยกเฉพาะไดรฟ์ที่ติดตั้งได้อย่างไร
Artur Meinild avatar
vn flag
นี่คือที่มาของทักษะการเขียนสคริปต์ของคุณ อย่างไรก็ตาม ดูเหมือนว่าสคริปต์ของคุณจะไม่แตกต่างจาก `lsblk` หรือ `df` มากนักด้วยพารามิเตอร์ที่ถูกต้อง พิจารณา `นามแฝง dfs='\df -hl -T -x"squashfs" -x"tmpfs" | grep -v "/var/lib/docker" | (read h; echo "$h"; sort -V)'` ซึ่งเรียงลำดับ `df` แต่ไม่มีอุปกรณ์ docker volumes หรือ squashfs และ tmpfs
Score:1
ธง in
Cas

มันต้องใช้ sudo แต่ใช้งานได้:

sudo lshw | grep -Pzo "\*-(ดิสก์|เนมสเปซ)(\n.*)+?\s+ขนาด:.*?\(\K\d+\w+" | tr "\0" "\n" | วาง - เอสดี/

มันให้ผลลัพธ์ดังนี้:

1TB/750GB

ไม่เช่นนั้นคุณจะไม่ทราบว่าเป็น TB/GB/MB หรือไม่ นั่นคือเหตุผลที่ฉันเก็บไว้

แก้ไข: ฉันสังเกตเห็น .* ไม่จำเป็นต้องใช้ regex คำสั่งด้านบนได้รับการปรับปรุง

คำอธิบาย:

sudo lshw: อืม... รายชื่อฮาร์ดแวร์ เราต้องการ sudo เพื่อดูไดรฟ์ในระบบ นี่จะเป็นแหล่งข้อมูลของเรา

grep -Pzo: เราจะใช้ regex เพื่อรับข้อมูลที่จำเป็น

-P = เปิดใช้งาน perl regex
-z = ถือว่าทุกอย่างเป็นหนึ่งบรรทัดยาว สิ่งนี้จำเป็นเนื่องจากเรากำลังจะใช้ regex หลายบรรทัด
-o = แทนที่จะแสดงผลลัพธ์และทำเครื่องหมายผลลัพธ์เป็นสีแดง เพียงแค่แสดงผลลัพธ์

regex (เคล็ดลับ: ลบ -o (a.k.a -Pz) และเพิ่ม regexes ด้านล่างทีละรายการเพื่อดูว่าเกิดอะไรขึ้นทีละขั้นตอน ข้อความสีแดงคือสิ่งที่ regex จับคู่ คุณจึงเห็นทีละขั้นตอนว่าเราเข้าใกล้กันมากขึ้น สู่ผลลัพธ์ที่ต้องการและสิ่งที่ทุกย่างก้าวเปลี่ยนสู่ผลลัพธ์):

\*-(disk|namespace) = ค้นหาข้อความทั้งหมดที่เป็น "*-disk" หรือ "*-namespace" เราต้องหลีกเลี่ยง (= \) "*" เพราะใน regex หมายถึงศูนย์หรือมากกว่านั้น แต่เราไม่ต้องการแบบนั้น เราต้องการค้นหาตัวอักษร "*"
(\n.*)+ = เพิ่ม ("+" = หนึ่งบรรทัดขึ้นไป) ต่อไปเรื่อยๆ ("\n" = ไปที่บรรทัดถัดไป ".*" = ทุกอย่างในบรรทัดนั้น) ในข้อความที่ตรงกัน; คุณจะเห็นว่าตอนนี้ทุกอย่างภายใต้การจับคู่ครั้งแรกของ "\*-(disk|namespace)" เป็นสีแดง
?\s+size: = เราเพิ่มบรรทัดต่อไปเรื่อย ๆ จนกว่าเราจะเจอช่องว่างแรก ("?" = ไม่โลภหรือที่รู้จักกันว่าการจับคู่แรกแทนที่จะเป็นการจับคู่สุดท้าย) ของช่องว่างอย่างน้อยหนึ่งช่อง (= "\s+"; "\ s" คือช่องว่าง (แท็บ เว้นวรรค ฯลฯ); "+" คือหนึ่งหรือมากกว่า) แล้วตามด้วย "ขนาด:"; คุณจะเห็นว่าผลลัพธ์นั้นเข้าใกล้ตัวเลขที่ต้องการมากขึ้น
.* = จับคู่ส่วนที่เหลือของบรรทัดนั้น
?\( = จนกว่าจะถึงคู่แรก (= ?) ของ "(" ซึ่งเราต้องหลีกเลี่ยงเพราะใช้ใน regex (คุณสามารถดูได้ว่าใช้ในส่วนแรกของ regex ที่นี่)
\K\d+\w+ = จับคู่ตัวเลข (= \d) อย่างน้อยหนึ่งครั้ง (= "+") และหลังจากนั้น อักขระคำ (= \w) อย่างน้อยหนึ่งครั้ง (= "+") ขณะนี้เรามีข้อความที่ต้องการในการจับคู่ แต่เราไม่ต้องการให้ข้อความที่ตรงกันทั้งหมดก่อนหน้านั้นในเอาต์พุต เราจึงใส่ "\K" ก่อนข้อความที่ต้องการเพื่อลบข้อความที่ตรงกันก่อน "\K" จาก ผลลัพธ์. ยังคงต้องจับคู่ แต่ไม่รวมในเอาต์พุต สิ่งนี้ทำให้ regex ทั้งหมดที่อยู่ข้างหน้าเป็น lookbehind ในเชิงบวก (look it up; "positive lookbehind perl regex") ด้วยความสามารถของ regex

tr "\0" "\n": จะเห็นว่าเราได้ข้อความที่ต้องการตรงกันแล้ว ไม่มากก็น้อย เมื่อเราเพิ่ม -o อีกครั้ง คุณจะเห็นว่าผลลัพธ์แสดงออกมาในลักษณะแปลกๆ (เรียงตามกัน) นั่นเป็นเพราะมันคั่นด้วยอักขระว่าง (= \0) ซึ่งคุณมองไม่เห็น แทนที่จะขึ้นบรรทัดใหม่ นี่คือสิ่งประดิษฐ์ของตัวเลือก "-z" ของ grep เพื่อแสดงในรายการปกติ กำลังจะแทนที่อักขระ null ด้วยการขึ้นบรรทัดใหม่โดยใช้ .

วาง -sd/: ตอนนี้เรามีผลลัพธ์เป็นรายการแล้ว เราสามารถใช้คำสั่ง paste เพื่อวางผลลัพธ์ไว้หลังกัน โดยใช้ "/" เป็นตัวแบ่ง

Cas avatar
in flag
Cas
regex ค่อนข้างซับซ้อน แต่ฉันคิดว่ามันสนุกที่จะเขียน ดังนั้นมันจึงไม่มีปัญหาฉันคิดว่ามันตลกที่ marosg พูดถึงว่าไม่ต้องการเขียนสคริปต์ทั้งหมดเมื่อฉันทำมันในท่อเดียว ดังนั้นอย่าฟังคนที่บ่นแบบนั้นมากเกินไป แม้ว่าฉันจะเห็นด้วยว่าคุณควรรู้สิ่งที่คุณทำเสมอ กำลังทำอยู่และไม่ใช่แค่คัดลอกสคริปต์ที่มีคนสร้างให้คุณเปล่าๆ การทำความเข้าใจกับสิ่งที่ผู้เขียนทำเป็นวิธีการเรียนรู้ที่ยอดเยี่ยม!
Grzegorz Michalak avatar
in flag
ขอบคุณ ดีใจที่ได้ยินเช่นนั้น :) คุณช่วยอธิบายว่าทุกส่วนของสคริปต์ของคุณกำลังทำอะไรอยู่
Grzegorz Michalak avatar
in flag
ขอบคุณ มันเยี่ยมมาก! ตอนนี้ฉันใช้สิ่งนี้: `lsscsi -s | awk '/N:/ {printf $NF}' | รอบ | ตัด -c 3- | รอบ && lsscsi -s | awk '$3 ~ /ATA/ {printf $NF}' | รอบ | ตัด -c 3- | รอบ `
Cas avatar
in flag
Cas
ดูการแก้ไขคำตอบของฉัน!
sudodus avatar
jp flag
+1; แต่ฉันต้องการคำนำหน้า LANG=C เพื่อให้คำสั่งของคุณทำงานได้ เพราะฉันไม่ใช้ภาษาอังกฤษ บางทีคุณสามารถแก้ไขคำตอบของคุณเพื่อรวมไว้
Score:1
ธง vn

ไม่ชัดเจนว่าคำถามของคุณคืออะไร ฉันหวังว่าคุณจะไม่ต้องการให้ใครมาเขียนสคริปต์ทั้งหมด แต่คุณถามวิธีรับตัวเลขที่คุณต้องการทำงานด้วย

ใช้ lshw นี่คือเอาต์พุต (แก้ไข) จากระบบของฉัน มี NVMe หนึ่งตัวและ SSD หนึ่งตัว

$ lshw -c ดิสก์
  *-เนมสเปซ               
       คำอธิบาย: เนมสเปซ NVMe
       ชื่อโลจิคัล: /dev/nvme0n1
       ขนาด: 953GiB (1024GB)
...
  *-ดิสก์
       คำอธิบาย: ดิสก์ ATA
       สินค้า: ซัมซุง SSD 850
       ชื่อตรรกะ: /dev/sda
       ขนาด: 931GiB (1TB)
...
Grzegorz Michalak avatar
in flag
ใช่ เป็นคำสั่งที่ดี แต่ฉันต้องการให้แสดงเฉพาะขนาด และถ้าเป็นไปได้ ขนาดนี้ในวงเล็บ (1TB, 1024GB เป็นต้น)
marosg avatar
vn flag
ไม่ซับซ้อนเกินไปที่จะแยกวิเคราะห์และแสดงตามที่คุณต้องการ อย่าคาดหวังว่าคนจะเขียนสคริปต์ทั้งหมดให้คุณ
Score:0
ธง jp

คำสั่งหนึ่งบรรทัดต่อไปนี้ควรทำสิ่งที่คุณต้องการ

สำหรับฉันใน $(lsblk -bdno ชื่อ,ขนาด|tr -s ' ' '_'); ทำ j=${i##*_};j=$(((j+500000000)/1000000000));printf "${i%_*}\t$j\tGB\n";done

คุณสามารถใส่ฟังก์ชั่นในของคุณ ~/.bashrc ใกล้กับนามแฝงเพื่อเรียกใช้งานด้วยคำสั่งสั้น ๆ เป็นต้น มายไดรฟ์

ฟังก์ชัน mydrives { สำหรับฉันใน $(lsblk -bdno ชื่อ,ขนาด|tr -s ' ' _'); ทำ j=${i##*_};j=$(((j+500000000)/1000000000));printf "${i%_*}\t$j\tGB\n";done }

มันใช้งานได้แบบนี้สำหรับฉันหลังจากนั้น

ที่มา ~/.bashrc

และในหน้าต่างเทอร์มินัลทั้งหมดที่คุณเปิดหลังจากแก้ไข ~/.bashrc ไฟล์.

ในคอมมันพิมพ์แบบนี้

$ มายไดรฟ์
sda 256GB
sdb 4001 กิกะไบต์
sr0 1 กิกะไบต์
nvme0n1 250 กิกะไบต์

ฉันคุ้นเคยกับ GiB (gibibytes) ดังนั้นฉันจึงมักใช้แบบธรรมดา lsblk สั่งการ

lsblk

หรือเมื่อฉันต้องการรายละเอียดเพิ่มเติมและมีหน้าต่างเทอร์มินัลที่กว้าง

lsblk -fm

หรือไม่เช่นนั้น

lsblk - ม

คำสั่งที่ตรงกับสิ่งที่ฉันแนะนำสำหรับคุณ แต่ด้วย mibibytes, gibibytes, tibibytes (ฐาน 2 แทนที่จะเป็นฐาน 10) จะเป็น

$ lsblk -dno ชื่อ ขนาด
เอสด้า238.5G
เอสดีบี 3,7T
sr0 1024M
nvme0n1 232,9G

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา