Điểm:3

Làm cách nào để thay đổi thứ tự sắp xếp `lsblk`?

lá cờ in

Biến đổi lsblk thứ tự sắp xếp

lsblk sắp xếp các phân vùng theo thứ tự khó theo dõi. Một phương pháp sắp xếp nó mà không cần phải viết tập lệnh bash hoặc tập lệnh python sẽ là lựa chọn đầu tiên.

Một câu hỏi tương tự đã được hỏi trong Unix & Linux:

Tuy nhiên, câu trả lời ở đó để sử dụng -x TÊN tham số để sắp xếp làm cho thụt lề cây biến mất.

Thứ tự sắp xếp hiện tại

đây là cách lsblk hiển thị ngay bây giờ:

$ lsdrv

TÊN FSTYPE LABEL KÍCH THƯỚC ĐIỂM NÚI MÔ HÌNH
nvme0n1 477G SSD Samsung 960 PRO 512GB               
âânvme0n1p9 hoán đổi [SWAP] 7.9G 
âânvme0n1p7 ext4 Old_Ubuntu_16.04 /mnt/old 23.1G 
âânvme0n1p5 ntfs 859M 
âânvme0n1p3 16M 
âânvme0n1p1 ntfs 450M 
âânvme0n1p8 ntfs Shared_WSL+Linux /mnt/e 9G 
âânvme0n1p10 ext4 Ubuntu_18.04 /mnt/clone 27.2G 
âânvme0n1p6 ext4 Mới_Ubuntu_16.04 / 45.1G 
âânvme0n1p4 ntfs NVMe_Win10 /mnt/c 363.2G 
âânvme0n1p2 vfat /boot/efi 99M 
mmcblk0 119.1G 
ââmmcblk0p1 vfat SANDISK128 /media/rick/SANDISK128 119.1G 
sr0 1024MDVD+/-RW DW316  
sda 931.5G HGST HTS721010A9
ââsda4 ntfs WINRETOOLS 450M 
ââsda2 128M 
ââsda5 ntfs Hình ảnh 11.4G 
ââsda3 ntfs HGST_Win10 /mnt/d 919G 
ââsda1 vfat ESP 500M 

Thứ tự sắp xếp được đề xuất

Đây là cách nó lsblk nên được sắp xếp:

$ lsdrv

TÊN FSTYPE LABEL KÍCH THƯỚC ĐIỂM NÚI MÔ HÌNH
nvme0n1 477G SSD Samsung 960 PRO 512GB               
âânvme0n1p1 ntfs 450M 
âânvme0n1p2 vfat /boot/efi 99M 
âânvme0n1p3 16M 
âânvme0n1p4 ntfs NVMe_Win10 /mnt/c 363.2G 
âânvme0n1p5 ntfs 859M 
âânvme0n1p6 ext4 Mới_Ubuntu_16.04 / 45.1G 
âânvme0n1p7 ext4 Old_Ubuntu_16.04 /mnt/old 23.1G 
âânvme0n1p8 ntfs Shared_WSL+Linux /mnt/e 9G 
âânvme0n1p9 hoán đổi [SWAP] 7.9G 
âânvme0n1p10 ext4 Ubuntu_18.04 /mnt/clone 27.2G 
mmcblk0 119.1G 
ââmmcblk0p1 vfat SANDISK128 /media/rick/SANDISK128 119.1G 
sr0 1024MDVD+/-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 Hình ảnh 11.4G 

Ghi chú: lsdrv là một bí danh được định nghĩa trong ~/.bashrc:

bí danh $ lsdrv

alias lsdrv='lsblk -o NAME,FSTYPE,LABEL,MOUNTPOINT,SIZE,MODEL |egrep -v "^loop"'

Tóm lược

Sự phức tạp của việc thay đổi thứ tự sắp xếp là:

  • Chỉ phân vùng có ký tự vẽ đường ââââ được sắp xếp theo ổ đĩa của họ.
  • Sau khi sắp xếp phân vùng, phân vùng cuối cùng có thể cần ââ thay thế bằng ââ.
  • Sau khi sắp xếp các phân vùng, phân vùng đầu tiên đến phân vùng cuối cùng thứ hai có thể cần ââ thay thế bằng ââ.
  • Người già "Gót chân Achilles" nơi phân loại 10 sau đó 1 , VÍ DỤ. 1 sau đó 10 sau đó 2 . Có thật không 9 nên xuất hiện trước 10.

Thứ tự sắp xếp của lsblk đã là một cái gai trong nhiều năm. Hy vọng rằng ai đó có một giải pháp đơn giản với các tiện ích GNU như: awk, sed, tiếng kêu, duy nhất và/hoặc loại, vân vân.

waltinator avatar
lá cờ it
Đọc `man stat`, bạn có thể viết giống như `lsblk` của riêng bạn với định dạng đầu ra của riêng bạn
Terrance avatar
lá cờ id
` lsblk --tree -x TÊN | grep -v loop` sẽ hoạt động tốt, nhưng tôi không chắc cách liệt kê như nvme0n1p2 trước nvme0n1p10 vì thứ tự sắp xếp là theo chữ số đầu tiên rồi đến chữ số thứ hai. Hmmmmmm
WinEunuuchs2Unix avatar
lá cờ in
@Terrance Phiên bản `lsblk từ util-linux 2.27.1` đưa ra thông báo lỗi với tham số `--tree`: `lsblk: tùy chọn không được nhận dạng '--tree'`. Bạn đang sử dụng phiên bản `lsblk` nào? VÍ DỤ. `lsblk --version`.
WinEunuuchs2Unix avatar
lá cờ in
@waltinator Thay vì viết một lệnh mới từ đầu bằng lệnh `stat`, việc lấy mã nguồn `lsblk` và sửa đổi nó có thể dễ dàng hơn.
heynnema avatar
lá cờ ru
Tôi nghi ngờ rằng lsblk hiển thị các phân vùng theo thứ tự vật lý thực tế như được tìm thấy trên đĩa. Nếu điều đó chính xác, thì bạn thực sự không muốn sắp xếp chúng chỉ để trông đẹp mắt. Ngoài ra, có vẻ như bạn có thể gặp ác mộng về phân vùng. Xin lỗi. gparted hiển thị gì?
WinEunuuchs2Unix avatar
lá cờ in
@heynnema Nhưng tôi thích khá :) `gparted` cho thấy một cơn ác mộng và Câu hỏi này đã được hỏi trong một dự án để bắt đầu hợp nhất các phân vùng lại với nhau để cài đặt Ubuntu 22.04 LTS. Theo như cách `lsblk` đang hiển thị chúng bây giờ thì bạn có thể đúng nhưng điều đó không liên quan đến tôi vào lúc này...
heynnema avatar
lá cờ ru
Bạn đang chạy 22.04? Và từ bỏ 16.04 và 18.04? Đó là báng bổ! Cười khúc khích. Đừng hợp nhất các phân vùng... hãy xóa sạch nó và bắt đầu làm mới... thoát khỏi cơn ác mộng.
waltinator avatar
lá cờ it
Xử lý "bản in đẹp" bằng các công cụ xử lý văn bản rất khó và hầu như không đáng để nỗ lực. Bỏ qua thứ tự phân vùng thực tế và cơn ác mộng có nguy cơ mất dữ liệu cao.
oldfred avatar
lá cờ cn
Tôi đang sử dụng 20.04 và lsblk liệt kê các phân vùng theo thứ tự số. Chúng không theo thứ tự đó trên các ổ đĩa.
heynnema avatar
lá cờ ru
Tôi có thể xác nhận... vào ngày 21.10... lsblk liệt kê theo số thứ tự.
WinEunuuchs2Unix avatar
lá cờ in
@waltinator Tôi đồng ý rằng đó không phải là một nhiệm vụ đơn giản. Nhưng khi điều gì đó làm bạn khó chịu trong nhiều năm, bạn không thể cưỡng lại mong muốn sửa chữa nó. Tôi vừa đăng một giải pháp.
WinEunuuchs2Unix avatar
lá cờ in
@heynnema Tôi đã từng xóa sạch và cài đặt lại. Năm năm qua, tôi đã sợ quá trình này :( Tôi hài lòng hơn khi dành thời gian rảnh của mình để phát triển phần mềm. Nhân tiện, tôi đã đăng câu trả lời ngay bây giờ.
WinEunuuchs2Unix avatar
lá cờ in
@oldfred Khi bạn gõ `lsblk --version` nó nói gì? Và đầu ra có giống với câu trả lời của tôi mà tôi vừa đăng bên dưới không?
Terrance avatar
lá cờ id
@ WinEunuuchs2Unix `lsblk từ util-linux 2.34`
heynnema avatar
lá cờ ru
@WinEunuuchs2Unix từ 21.10... `lsblk từ util-linux 2.36.1`
heynnema avatar
lá cờ ru
@WinEunuuchs2Unix re: *"Tôi đã từng xóa sạch và cài đặt lại.Năm năm qua, tôi đã trở nên sợ hãi quá trình này"*... ​​vấn đề là gì?
WinEunuuchs2Unix avatar
lá cờ in
@heynnema Vấn đề là tôi đã quên nhiều chương trình tôi cần cài đặt lại và cách định cấu hình chúng để hoạt động theo cách tôi thích. Dự án tiếp theo của tôi sẽ là cài đặt mới 22.04 và tự động cài đặt lại tất cả các chương trình trên phân vùng cũ cộng với đưa dữ liệu từ phân vùng cũ vào. Đồng thời mang các tệp cấu hình `/etc` và `~/.config/` từ phân vùng cũ. Rất đơn giản, tôi cần điều này vì A) Tôi quên những gì tôi đã cài đặt hoặc B) Tôi quá lười để tự làm từng cái một hoặc C) Bỏ qua nhiều phiên bản LTS hoặc phiên bản Minor cùng một lúc.
heynnema avatar
lá cờ ru
@WinEunuuchs2Unix Bạn có thể sử dụng `Synaptic's` **Tạo Tập lệnh tải xuống gói** (menu Tệp) để tự động hóa một số việc đó.
WinEunuuchs2Unix avatar
lá cờ in
@heynnema Cảm ơn vì mẹo. Tôi không muốn hoàn toàn "phát minh lại bánh xe" vì một số phiên bản đầu tiên có xu hướng vuông và không lăn chút nào.
heynnema avatar
lá cờ ru
@ WinEunuuchs2Unix Tôi không hiểu ý của bạn lắm.
oldfred avatar
lá cờ cn
Chỉ vì đã hỏi, vì nếu không thì đã được giải quyết. fred@z170-focal-k:~$ lsblk --version `lsblk từ util-linux 2.34`
Điểm:3
lá cờ in

Cuối cùng tôi đã viết một hàm sắp xếp chung để giải quyết vấn đề.

Mới mẻ lsblk thứ tự sắp xếp

$ lsdrv | sblk

TÊN FSTYPE LABEL KÍCH THƯỚC ĐIỂM NÚI MÔ HÌNH
nvme0n1 477G SSD Samsung 960 PRO 512GB               
âânvme0n1p1 ntfs 450M 
âânvme0n1p2 vfat /boot/efi 99M 
âânvme0n1p3 16M 
âânvme0n1p4 ntfs NVMe_Win10 /mnt/c 363.2G 
âânvme0n1p5 ntfs 859M 
âânvme0n1p6 ext4 Mới_Ubuntu_16.04 / 45.1G 
âânvme0n1p7 ext4 Old_Ubuntu_16.04 /mnt/old 23.1G 
âânvme0n1p8 ntfs Shared_WSL+Linux /mnt/e 9G 
âânvme0n1p9 hoán đổi [SWAP] 7.9G 
âânvme0n1p10 ext4 Ubuntu_18.04 /mnt/clone 27.2G 
mmcblk0 119.1G 
ââmmcblk0p1 vfat SANDISK128 /media/rick/SANDISK128 119.1G 
sr0 1024MDVD+/-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 Hình ảnh 11.4G 

Tập lệnh Bash để sắp xếp lsblk đầu ra

Phải mất vài giờ tra cứu các lệnh bash khác nhau để đưa ra giải pháp. Tập lệnh bash, ban đầu được gọi là sblk, có thể được điều chỉnh cho các mục đích khác:

#!/bin/bash
# Hỏi Ubuntu: https://askubuntu.com/questions/1392560/how-to-change-lsblk-sort-order
oIFS="$IFS" # Lưu IFS
NẾU='|' # Sử dụng "|" như dấu phân cách mảng
khai báo -a partiions=() # Mảng phân vùng cho một ổ đĩa nhất định

thêm_phần () {
    line="$1" # Tham số khó hiểu $1 trở nên rõ ràng
    part=${line%% *} # lấy tên phân vùng, sau đó lấy số
    key=$(echo "$part" | grep -Eo '[0-9]+$')

    # Nếu độ dài của số nhỏ hơn 2, hãy thêm "0" vào trước
    nếu [[ "${#key}" < 2 ]]; sau đó
        key="0$key" # Thêm "0" vào trước một chữ số
    fi

    line="${line:2}" # Loại bỏ ký tự cây
    partitions+=( "$key$line" ) # Dòng cũ "ââ..." giờ là mục mảng "99..."
}

sort_parts () {
    # Sắp xếp mảng phân vùng bằng phím sắp xếp thành mảng "đã sắp xếp" mới
    đọc -r -d '' -a đã sắp xếp < <( 
        tiếng vang "${phân vùng[*]}" | tr "|" "\n" | sắp xếp | tr "\n" "|" )
    last_i=$(( ${#sorted[@]} - 1 )) # Chỉ mục dựa trên số 0 cuối cùng trong mảng được sắp xếp

    for ((i=0; i <= $last_i; i++)); làm
        line="${sorted[i]}" # Nhận dòng mảng tại chỉ mục dựa trên 0
        line="${line:2}" # Loại bỏ khóa sắp xếp "99"
        nếu [[ $i -lt $last_i ]]; sau đó
            echo "ââ$line" # In dòng không phải dòng cuối cùng
        khác
            echo "ââ$line" # In dòng cuối cùng
        fi
    xong
    partitions=() # Mảng phân vùng trống cho ổ đĩa tiếp theo
}

# Vòng lặp chính
trong khi đọc dòng
làm
    first="${line:0:2}"
    nếu [[ "$first" == "ââ" || "$first" == "ââ" ]]; sau đó
        add_part "$line" # Thêm dòng đặc biệt vào mảng phân vùng

        if [[ "$first" == "ââ" ]]; sau đó
            sort_parts # Phân vùng cuối cùng. Sắp xếp và in mảng
        fi
    khác
        echo "$line" # Chỉ cần in một dòng thông thường
    fi

xong < "${1:-/dev/stdin}" # Đọc từ tệp $1 hoặc từ đầu vào tiêu chuẩn


IFS="$oIFS" # Khôi phục IFS cũ
Terrance avatar
lá cờ id
Rất tốt! Không cần phải lo lắng về phiên bản `lsblk`. +1 bạn của tôi! :)
heynnema avatar
lá cờ ru
+1 cho sự kiên trì :-)

Đă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.