AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1392560
Accepted
WinEunuuchs2Unix
WinEunuuchs2Unix
Asked: 2022-02-13 10:57:35 +0800 CST2022-02-13 10:57:35 +0800 CST 2022-02-13 10:57:35 +0800 CST

如何更改“lsblk”排序顺序?

  • 772

更改lsblk排序顺序

lsblk以难以遵循的顺序对分区进行排序。一种无需编写 bash 脚本或 python 脚本即可对其进行排序的方法将是首选。

在 Unix 和 Linux 中也提出了类似的问题:

  • lsblk 输出未排序

但是,使用-x NAME参数进行排序的答案会导致树缩进消失。

当前排序顺序

这是lsblk现在的显示方式:

$ lsdrv

NAME         FSTYPE   LABEL            MOUNTPOINT                    SIZE MODEL
nvme0n1                                                              477G Samsung SSD 960 PRO 512GB               
├─nvme0n1p9  swap                      [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     New_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                                                                 1024M DVD+/-RW DW316  
sda                                                                931.5G HGST HTS721010A9
├─sda4       ntfs     WINRETOOLS                                     450M 
├─sda2                                                               128M 
├─sda5       ntfs     Image                                         11.4G 
├─sda3       ntfs     HGST_Win10       /mnt/d                        919G 
└─sda1       vfat     ESP                                            500M 

建议的排序顺序

这是它lsblk应该如何排序:

$ lsdrv

NAME         FSTYPE   LABEL            MOUNTPOINT                    SIZE MODEL
nvme0n1                                                              477G Samsung SSD 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     New_Ubuntu_16.04 /                            45.1G 
├─nvme0n1p7  ext4     Old_Ubuntu_16.04 /mnt/old                     23.1G 
├─nvme0n1p8  ntfs     Shared_WSL+Linux /mnt/e                          9G 
├─nvme0n1p9  swap                      [SWAP]                        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     Image                                         11.4G 

注意: lsdrv是在 中定义的别名~/.bashrc:

$ alias lsdrv

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

概括

更改排序顺序的复杂性是:

  • 只有带有线条绘制字符的分区├─并└─在其驱动器下排序。
  • 对分区进行排序后,最后一个分区可能需要├─替换为└─.
  • 对分区进行排序后,可能需要将第一个分区到倒数第二个分区└─替换为├─.
  • 旧的“阿喀琉斯之踵”排序位置10之后,然后1 是 EG 。真的应该出现在眼前。1 102 9 10

多年来,排序顺序lsblk一直是个难题。希望有人有一个简单的 GNU 实用程序解决方案,例如:、、awk和/或等。sedgrepuniqsort

partitioning
  • 1 1 个回答
  • 259 Views

1 个回答

  • Voted
  1. Best Answer
    WinEunuuchs2Unix
    2022-02-13T14:50:48+08:002022-02-13T14:50:48+08:00

    我最终编写了一个通用的排序函数来解决这个问题。

    新的lsblk排序顺序

    $ lsdrv | sblk
    
    NAME         FSTYPE   LABEL            MOUNTPOINT                    SIZE MODEL
    nvme0n1                                                              477G Samsung SSD 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     New_Ubuntu_16.04 /                            45.1G 
    ├─nvme0n1p7  ext4     Old_Ubuntu_16.04 /mnt/old                     23.1G 
    ├─nvme0n1p8  ntfs     Shared_WSL+Linux /mnt/e                          9G 
    ├─nvme0n1p9  swap                      [SWAP]                        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     Image                                         11.4G 
    

    lsblk用于对输出进行排序的 Bash 脚本

    花了几个小时在谷歌上搜索不同的 bash 命令才能找到解决方案。最初称为 的 bash 脚本sblk可用于其他目的:

    #!/bin/bash
    # Ask Ubuntu: https://askubuntu.com/questions/1392560/how-to-change-lsblk-sort-order
    oIFS="$IFS"                         # Save IFS
    IFS='|'                             # Use "|" as array delimiter
    declare -a partiions=()             # Partitions array for a given drive
    
    add_part () {
        line="$1"                       # Confusing parameter $1 becomes obvious
        part=${line%% *}                # get partition name, then get number
        key=$(echo "$part" | grep -Eo '[0-9]+$')
    
        # If length of number is less than 2, prepend "0"
        if [[ "${#key}" < 2 ]]; then
            key="0$key"                 # Prepend "0" to single digit
        fi
    
        line="${line:2}"                # Strip out tree character
        partitions+=( "$key$line" )     # Old line "├─..." now array entry "99..."
    }
    
    sort_parts () {
        # Sort partitions array with sort key into new "sorted" array
        read -r -d '' -a sorted < <( 
            echo "${partitions[*]}" | tr "|" "\n" | sort | tr "\n" "|" )
        last_i=$(( ${#sorted[@]} - 1 )) # Last 0-based index in sorted array
    
        for ((i=0; i <= $last_i; i++)); do
            line="${sorted[i]}"         # Get array line at 0-based index
            line="${line:2}"            # Strip out sort key "99"
            if [[ $i -lt $last_i ]]; then
                echo "├─$line"          # Print a line that is not the last line
            else
                echo "└─$line"          # Print last line
            fi
        done
        partitions=()                   # Empty partitions array for the next drive
    }
    
    # Main Loop
    while read line
    do
        first="${line:0:2}"
        if [[ "$first" == "├─" || "$first" == "└─" ]]; then
            add_part "$line"            # Add special line to partitions array
    
            if [[ "$first" == "└─" ]]; then
                sort_parts              # Last partition. Sort and print array
            fi
        else
            echo "$line"                # Simply print a regular line
        fi
    
    done < "${1:-/dev/stdin}"           # Read from file $1 or from standard input
    
    
    IFS="$oIFS"                         # Restore old IFS
    
    • 3

相关问题

  • 是否有更好的方式为 /home/userX 构建分区/挂载

  • Linux 文件系统层次结构中的默认目录是什么意思?

  • 如何将 /usr 移动到新分区?

  • 如何从双启动计算机访问加密的主文件夹?

  • 您对台式机和家庭服务器的驱动器分区方案有什么建议?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve