Score:3

จะเปลี่ยนลำดับการจัดเรียง `lsblk` ได้อย่างไร

ธง in

เปลี่ยน lsblk ลำดับการจัดเรียง

lsblk แบ่งพาร์ติชันตามลำดับที่ยากต่อการปฏิบัติตาม วิธีการจัดเรียงโดยไม่ต้องเขียนสคริปต์ทุบตีหรือสคริปต์หลามจะเป็นตัวเลือกแรก

มีการถามคำถามที่คล้ายกันใน Unix & Linux:

อย่างไรก็ตามมีคำตอบที่จะใช้ -x ชื่อ พารามิเตอร์สำหรับการเรียงลำดับทำให้การเยื้องต้นไม้หายไป

ลำดับการจัดเรียงปัจจุบัน

นี่คือวิธีการ lsblk แสดงตอนนี้:

$lsdrv

ชื่อ FSTYPE LABEL MOUNTPOINT SIZE MODEL
nvme0n1 477G ซัมซุง SSD 960 PRO 512GB               
âânvme0n1p9 สลับ [สลับ] 7.9G 
âânvme0n1p7 ext4 Old_Ubuntu_16.04 /mnt/23.1G เก่า 
âânvme0n1p5 ntfs 859M 
âânvme0n1p3 16M 
âânvme0n1p1 ntfs 450M 
âânvme0n1p8 ntfs ที่ใช้ร่วมกัน_WSL+Linux /mnt/e 9G 
âânvme0n1p10 ext4 Ubuntu_18.04 /mnt/clone 27.2G 
âânvme0n1p6 ext4 ใหม่_Ubuntu_16.04 / 45.1G 
âânvme0n1p4 ntfs NVMe_Win10 /mnt/c 363.2G 
âânvme0n1p2 vfat /บูต/efi 99M 
mmcblk0 119.1G 
ââmmcblk0p1 vfat SANDISK128 /media/rick/SANDISK128 119.1G 
sr0 1024M DVD+/-RW DW316  
sda 931.5G HGST HTS721010A9
ââsda4 ntfs WINRETOOLS 450M 
ââsda2 128M 
ââsda5 ntfs รูปภาพ 11.4G 
ââsda3 ntfs HGST_Win10 /mnt/d 919G 
ââsda1 vfat ESP 500M 

ลำดับการจัดเรียงที่เสนอ

นี่คือวิธีการ lsblk ควรจัดเรียง:

$lsdrv

ชื่อ FSTYPE LABEL MOUNTPOINT SIZE MODEL
nvme0n1 477G ซัมซุง SSD 960 PRO 512GB               
âânvme0n1p1 ntfs 450M 
âânvme0n1p2 vfat /บูต/efi 99M 
âânvme0n1p3 16M 
âânvme0n1p4 ntfs NVMe_Win10 /mnt/c 363.2G 
âânvme0n1p5 ntfs 859M 
âânvme0n1p6 ext4 ใหม่_Ubuntu_16.04 / 45.1G 
âânvme0n1p7 ext4 Old_Ubuntu_16.04 /mnt/23.1G เก่า 
âânvme0n1p8 ntfs ที่ใช้ร่วมกัน_WSL+Linux /mnt/e 9G 
âânvme0n1p9 สลับ [สลับ] 7.9G 
âânvme0n1p10 ext4 Ubuntu_18.04 /mnt/clone 27.2G 
mmcblk0 119.1G 
ââmmcblk0p1 vfat SANDISK128 /media/rick/SANDISK128 119.1G 
sr0 1024M DVD+/-RW DW316  
sda 931.5G HGST HTS721010A9
ââsda1 vfat ESP 500M 
ââsda2 128M 
ââsda3 ntfs HGST_Win10 /mnt/d 919G 
ââsda4 ntfs WINRETOOLS 450M 
ââsda5 ntfs รูปภาพ 11.4G 

บันทึก: lsdrv เป็นนามแฝงที่กำหนดไว้ใน ~/.bashrc:

$ นามแฝง lsdrv

นามแฝง lsdrv='lsblk -o NAME,FSTYPE,LABEL,MOUNTPOINT,SIZE,MODEL |egrep -v "^loop"'

สรุป

ความซับซ้อนของการเปลี่ยนแปลงลำดับการจัดเรียงคือ:

  • พาร์ติชันที่มีอักขระลากเส้นเท่านั้น ââ และ ââ ถูกจัดเรียงภายใต้ไดรฟ์ของพวกเขา
  • หลังจากจัดเรียงพาร์ติชันแล้ว อาจต้องใช้พาร์ติชันสุดท้าย ââ แทนที่ด้วย ââ.
  • หลังจากจัดเรียงพาร์ติชันแล้ว อาจต้องใช้พาร์ติชันแรกไปยังพาร์ติชันสุดท้ายที่สอง ââ แทนที่ด้วย ââ.
  • เก่า "ส้นเท้าของ Achilles" ของการเรียงลำดับสถานที่ 10 หลังจาก 1 , เช่น. 1 แล้ว 10 แล้ว 2 . จริงๆ 9 ควรปรากฏก่อน 10.

ลำดับการจัดเรียงของ lsblk เป็นหนามยอกอกมาหลายปี หวังว่าบางคนจะมีวิธีแก้ปัญหาง่ายๆ ด้วยยูทิลิตี้ GNU เช่น: อึดอัด, เสด, เกรป, ยูนิค และ/หรือ เรียงลำดับฯลฯ

waltinator avatar
it flag
อ่าน `man stat` คุณสามารถเขียน `lsblk` ของคุณเองด้วยรูปแบบผลลัพธ์ของคุณเอง
Terrance avatar
id flag
`lsblk --tree -x ชื่อ | grep -v loop` ควรทำงานได้ดี แต่ฉันไม่แน่ใจว่าจะแสดงรายการเช่น nvme0n1p2 ก่อน nvme0n1p10 ได้อย่างไร เนื่องจากลำดับการจัดเรียงคือตามหลักแรกและหลักที่สอง อืมมมมม
WinEunuuchs2Unix avatar
in flag
@Terrance เวอร์ชัน `lsblk จาก util-linux 2.27.1` ให้ข้อความแสดงข้อผิดพลาดพร้อมพารามิเตอร์ `--tree`: `lsblk: ตัวเลือกที่ไม่รู้จัก '--tree'` คุณใช้ `lsblk` เวอร์ชันใด เช่น. `lsblk --version`.
WinEunuuchs2Unix avatar
in flag
@waltinator แทนที่จะเขียนคำสั่งใหม่ตั้งแต่ต้นด้วยคำสั่ง `stat` มันอาจจะง่ายกว่าการใช้ซอร์สโค้ด `lsblk` และแก้ไขมัน
heynnema avatar
ru flag
ฉันสงสัยว่า lsblk แสดงพาร์ติชันตามลำดับจริงตามที่พบในดิสก์ หากถูกต้อง คุณคงไม่ต้องการจัดเรียงเพียงเพื่อให้ดูสวยงาม นอกจากนี้ ดูเหมือนว่าคุณอาจฝันร้ายเรื่องการแบ่งพาร์ติชัน เสียใจ. gparted แสดงอะไร
WinEunuuchs2Unix avatar
in flag
@heynnema แต่ฉันชอบสวย :) `gparted` แสดงฝันร้ายและคำถามนี้ถูกถามในระหว่างโครงการเพื่อเริ่มการรวมพาร์ติชันเข้าด้วยกันสำหรับการติดตั้ง Ubuntu 22.04 LTS เท่าที่ `lsblk` แสดงตอนนี้คุณอาจถูกต้อง แต่นั่นไม่เกี่ยวกับฉันในตอนนี้...
heynnema avatar
ru flag
คุณใช้ 22.04? และให้ขึ้น 16.04 และ 18.04? นั่นคือการดูหมิ่น! ขำ. อย่ารวมพาร์ติชั่น... เช็ดมันแล้วเริ่มใหม่... กำจัดฝันร้าย
waltinator avatar
it flag
การจัดการกับ "การพิมพ์สวย" ด้วยเครื่องมือประมวลผลข้อความนั้นยาก และแทบไม่คุ้มกับความพยายาม การเพิกเฉยต่อลำดับพาร์ติชั่นจริงและฝันร้ายนั้นมีความเสี่ยงสูงที่ข้อมูลจะสูญหาย
oldfred avatar
cn flag
ฉันใช้ 20.04 และ lsblk แสดงรายการพาร์ติชันตามลำดับตัวเลข พวกเขาไม่ได้อยู่ในลำดับนั้นในไดรฟ์
heynnema avatar
ru flag
ฉันสามารถยืนยัน...วันที่ 21.10... lsblk รายการตามลำดับตัวเลข
WinEunuuchs2Unix avatar
in flag
@waltinator ฉันยอมรับว่ามันไม่ใช่งานง่ายๆ แต่เมื่อมีบางสิ่งที่รบกวนจิตใจคุณมานานหลายปี คุณก็ไม่สามารถต้านทานความอยากที่จะแก้ไขมันได้ ฉันเพิ่งโพสต์วิธีแก้ปัญหา
WinEunuuchs2Unix avatar
in flag
@heynnema ฉันเคยลบและติดตั้งใหม่ ห้าปีที่ผ่านมาฉันกลัวกระบวนการ :( ฉันพอใจที่จะใช้เวลาว่างในการพัฒนาซอฟต์แวร์มากขึ้น BTW ฉันเพิ่งโพสต์คำตอบ
WinEunuuchs2Unix avatar
in flag
@oldfred เมื่อคุณพิมพ์ `lsblk --version` มันพูดว่าอะไร? และผลลัพธ์ดูเหมือนกับคำตอบของฉันที่ฉันเพิ่งโพสต์ด้านล่างหรือไม่
Terrance avatar
id flag
@ WinEunuuchs2Unix `lsblk จาก util-linux 2.34`
heynnema avatar
ru flag
@ WinEunuuchs2Unix จาก 21.10... `lsblk จาก util-linux 2.36.1`
heynnema avatar
ru flag
@ WinEunuuchs2Unix re: *"ฉันเคยลบและติดตั้งใหม่ห้าปีที่ผ่านมาฉันกลัวกระบวนการนี้"*... ​​มีปัญหาอะไรไหม
WinEunuuchs2Unix avatar
in flag
@heynnema ปัญหาคือฉันลืมโปรแกรมจำนวนมากที่ฉันต้องติดตั้งใหม่และวิธีกำหนดค่าให้ทำงานในลักษณะที่ฉันต้องการ โครงการต่อไปของฉันคือการติดตั้ง 22.04 ใหม่และติดตั้งโปรแกรมทั้งหมดบนพาร์ติชั่นเก่าโดยอัตโนมัติรวมทั้งนำข้อมูลจากพาร์ติชั่นเก่า นำไฟล์คอนฟิกูเรชัน `/etc` และ `~/.config/` จากพาร์ติชันเก่ามาด้วย ฉันต้องการสิ่งนี้เพราะ A) ฉันลืมสิ่งที่ติดตั้งไว้ หรือ B) ฉันขี้เกียจเกินไปที่จะทำทีละตัว หรือ C) ข้ามเวอร์ชัน LTS หรือเวอร์ชันรองหลายเวอร์ชันพร้อมกัน
heynnema avatar
ru flag
@ WinEunuuchs2Unix คุณอาจใช้ `Synaptic's` **Generate Package Download Script** (เมนูไฟล์) เพื่อดำเนินการบางอย่างโดยอัตโนมัติ
WinEunuuchs2Unix avatar
in flag
@heynnema ขอบคุณสำหรับคำแนะนำ ฉันไม่ต้องการ "สร้างวงล้อใหม่" โดยสิ้นเชิง เพราะรุ่นแรกๆ มักจะเป็นรูปสี่เหลี่ยมจัตุรัสและไม่หมุนเลย
heynnema avatar
ru flag
@ WinEunuuchs2Unix ฉันไม่ค่อยเข้าใจว่าคุณหมายถึงอะไร
oldfred avatar
cn flag
เพียงเพราะถามเนื่องจากแก้ไขเป็นอย่างอื่น fred@z170-focal-k:~$ lsblk --version `lsblk จาก util-linux 2.34`
Score:3
ธง in

ฉันลงเอยด้วยการเขียนฟังก์ชันการเรียงลำดับทั่วไปเพื่อแก้ปัญหา

ใหม่ lsblk ลำดับการจัดเรียง

$ lsdrv | sblk

ชื่อ FSTYPE LABEL MOUNTPOINT SIZE MODEL
nvme0n1 477G ซัมซุง SSD 960 PRO 512GB               
âânvme0n1p1 ntfs 450M 
âânvme0n1p2 vfat /บูต/efi 99M 
âânvme0n1p3 16M 
âânvme0n1p4 ntfs NVMe_Win10 /mnt/c 363.2G 
âânvme0n1p5 ntfs 859M 
âânvme0n1p6 ext4 ใหม่_Ubuntu_16.04 / 45.1G 
âânvme0n1p7 ext4 Old_Ubuntu_16.04 /mnt/23.1G เก่า 
âânvme0n1p8 ntfs ที่ใช้ร่วมกัน_WSL+Linux /mnt/e 9G 
âânvme0n1p9 สลับ [สลับ] 7.9G 
âânvme0n1p10 ext4 Ubuntu_18.04 /mnt/clone 27.2G 
mmcblk0 119.1G 
ââmmcblk0p1 vfat SANDISK128 /media/rick/SANDISK128 119.1G 
sr0 1024M DVD+/-RW DW316  
sda 931.5G HGST HTS721010A9
ââsda1 vfat ESP 500M 
ââsda2 128M 
ââsda3 ntfs HGST_Win10 /mnt/d 919G 
ââsda4 ntfs WINRETOOLS 450M 
ââsda5 ntfs รูปภาพ 11.4G 

สคริปต์ทุบตีเพื่อจัดเรียง lsblk เอาต์พุต

ใช้เวลาสองสามชั่วโมงใน googling คำสั่ง bash ที่แตกต่างกันเพื่อสร้างวิธีแก้ปัญหา สคริปต์ทุบตี เริ่มแรกเรียกว่า sblk, สามารถดัดแปลงเพื่อวัตถุประสงค์อื่น:

#!/bin/bash
# ถาม Ubuntu: https://askubuntu.com/questions/1392560/how-to-change-lsblk-sort-order
oIFS="$IFS" # บันทึกไอเอฟเอส
ไอเอฟเอส='|' # ใช้ "|" เป็นตัวคั่นอาร์เรย์
ประกาศ -a partiions=() # อาร์เรย์พาร์ติชันสำหรับไดรฟ์ที่กำหนด

add_part () {
    line="$1" # พารามิเตอร์ที่สับสน $1 จะชัดเจน
    part=${line%% *} # รับชื่อพาร์ติชัน แล้วรับหมายเลข
    key=$(echo "$part" | grep -Eo '[0-9]+$')

    # ถ้าความยาวของตัวเลขน้อยกว่า 2 ให้เติม "0" นำหน้า
    ถ้า [[ "${#key}" < 2 ]]; แล้ว
        key="0$key" # ต่อท้าย "0" เป็นเลขหลักเดียว
    ไฟ

    line="${line:2}" # ตัดอักขระต้นไม้ออก
    partitions+=( "$key$line" ) # บรรทัดเก่า "ââ..." ตอนนี้รายการอาร์เรย์ "99..."
}

sort_parts () {
    # จัดเรียงพาร์ติชั่นอาร์เรย์ด้วยคีย์การเรียงลำดับเป็นอาร์เรย์ "เรียงลำดับ" ใหม่
    อ่าน -r -d '' -a เรียง < <( 
        echo "${พาร์ติชั่น[*]}" | tr "|" "\n" | จัดเรียง | tr "\n" "|" )
    last_i=$(( ${#sorted[@]} - 1 )) # ดัชนีอิง 0 สุดท้ายในอาร์เรย์ที่เรียงลำดับ

    สำหรับ ((i=0; i <= $last_i; i++)); ทำ
        line="${sorted[i]}" # รับบรรทัดอาร์เรย์ที่ดัชนีตาม 0
        line="${line:2}" # ตัดคีย์การเรียงลำดับ "99"
        ถ้า [[ $i -lt $last_i ]]; แล้ว
            echo "ââ$line" # พิมพ์บรรทัดที่ไม่ใช่บรรทัดสุดท้าย
        อื่น
            echo "ââ$line" # พิมพ์บรรทัดสุดท้าย
        ไฟ
    เสร็จแล้ว
    พาร์ติชัน = () # อาร์เรย์พาร์ติชันว่างสำหรับไดรฟ์ถัดไป
}

#ห่วงหลัก
ขณะอ่านไลน์
ทำ
    first="${line:0:2}"
    ถ้า [[ "$first" == "ââ" || "$ก่อน" == "ââ" ]]; แล้ว
        add_part "$line" # เพิ่มบรรทัดพิเศษในพาร์ติชันอาร์เรย์

        ถ้า [[ "$first" == "ââ" ]]; แล้ว
            sort_parts # พาร์ติชันสุดท้าย จัดเรียงและพิมพ์อาร์เรย์
        ไฟ
    อื่น
        echo "$line" # เพียงพิมพ์บรรทัดปกติ
    ไฟ

เสร็จสิ้น < "${1:-/dev/stdin}" # อ่านจากไฟล์ $1 หรือจากอินพุตมาตรฐาน


IFS="$oIFS" # คืนค่า IFS เก่า
Terrance avatar
id flag
ดีมาก! ไม่ต้องกังวลเกี่ยวกับเวอร์ชัน `lsblk` +1 เพื่อนของฉัน! :)
heynnema avatar
ru flag
+1 สำหรับการคงอยู่ :-)

โพสต์คำตอบ

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