Рейтинг:3

Как изменить порядок сортировки lsblk?

флаг in

Изменять лсблк Порядок сортировки

лсблк сортирует разделы в порядке, который трудно соблюсти. Первым выбором будет метод сортировки без необходимости написания скрипта bash или скрипта python.

Аналогичный вопрос был задан в Unix и Linux:

Однако ответ там для использования -x ИМЯ Параметр для сортировки приводит к исчезновению отступов дерева.

Текущий порядок сортировки

Вот как лсблк отображает сейчас:

$ лсдрв

НАИМЕНОВАНИЕ ТИП FS ЭТИКЕТКА ТОЧКА КРЕПЛЕНИЯ РАЗМЕР МОДЕЛЬ
nvme0n1 477G Твердотельный накопитель Samsung 960 PRO 512 ГБ               
âânvme0n1p9 своп [SWAP] 7.9G 
âânvme0n1p7 ext4 Old_Ubuntu_16.04 /mnt/old 23.1G 
âânvme0n1p5 нтфс 859M 
âânvme0n1p3 16M 
âânvme0n1p1 нтфс 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 Изображение 11.4G 
ââsda3 ntfs HGST_Win10 /mnt/d 919G 
ââsda1 vfat ESP 500M 

Предлагаемый порядок сортировки

Вот как это лсблк должны быть отсортированы:

$ лсдрв

НАИМЕНОВАНИЕ ТИП FS ЭТИКЕТКА ТОЧКА КРЕПЛЕНИЯ РАЗМЕР МОДЕЛЬ
nvme0n1 477G Твердотельный накопитель Samsung 960 PRO 512 ГБ               
âânvme0n1p1 нтфс 450M 
âânvme0n1p2 vfat /boot/efi 99M 
âânvme0n1p3 16M 
âânvme0n1p4 ntfs NVMe_Win10 /mnt/c 363.2G 
âânvme0n1p5 нтфс 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] 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 

Примечание: лсдрв псевдоним, определенный в ~/.bashrc:

$ псевдоним lsdrv

псевдоним lsdrv='lsblk -o ИМЯ,ТИП,ЭТИКЕТКА,ТОЧКА МОНТАЖА,РАЗМЕР,МОДЕЛЬ |egrep -v "^loop"'

Резюме

Сложности изменения порядка сортировки:

  • Только разделы с символами рисования линий ââ и â сортируются по своим дискам.
  • После сортировки разделов может понадобиться последний раздел ââ заменено на â.
  • После сортировки разделов может потребоваться от первого до предпоследнего раздела. â заменено на ââ.
  • Старый "Ахиллесова пята" сортировочных мест 10 после 1 , Э.Г. 1 тогда 10 тогда 2 . Действительно 9 должен появиться перед 10.

Порядок сортировки лсблк был шипом в течение многих лет. Надеюсь, у кого-то есть простое решение с помощью утилит GNU, таких как: аук, сед, grep, уникальный и/или Сортировать, и т.д.

waltinator avatar
флаг it
Прочтите `man stat`, вы можете написать свой собственный `lsblk` с вашим собственным форматом вывода.
Terrance avatar
флаг id
`lsblk --tree -x ИМЯ | grep -v loop` должен работать нормально, но я не уверен, как вывести список вроде nvme0n1p2 перед nvme0n1p10, поскольку порядок сортировки - сначала по первой, а затем по второй цифре. Хмммммм
WinEunuuchs2Unix avatar
флаг in
@Terrance Версия `lsblk from util-linux 2.27.1` выдает сообщение об ошибке с параметром `--tree`: `lsblk: нераспознанный параметр '--tree'`. Какую версию lsblk вы используете? НАПРИМЕР. `lsblk --версия`.
WinEunuuchs2Unix avatar
флаг in
@waltinator Вместо того, чтобы писать новую команду с нуля с помощью команды stat, может быть проще взять исходный код lsblk и изменить его.
heynnema avatar
флаг ru
Я подозреваю, что lsblk показывает разделы в реальном физическом порядке, найденном на диске. Если это так, то вы действительно не хотите сортировать их только для того, чтобы выглядеть красиво. Кроме того, похоже, что у вас все равно может быть кошмар с разделами. Сожалею. Что показывает gparted?
WinEunuuchs2Unix avatar
флаг in
@heynnema Но мне нравится красиво :) `gparted` действительно показывает кошмар, и этот вопрос был задан во время проекта, чтобы начать объединение разделов вместе для установки Ubuntu 22.04 LTS. Что касается того, как `lsblk` отображает их сейчас, возможно, вы правы, но меня это пока не касается...
heynnema avatar
флаг ru
Вы работаете 22.04? И отказаться от 16.04 и 18.04? Это богохульство! Хихи. Не объединяйте разделы... сотрите их и начните заново... избавьтесь от кошмара.
waltinator avatar
флаг it
Работа с «красивой печатью» с помощью инструментов обработки текста сложна и вряд ли когда-либо стоит затраченных усилий. Игнорирование фактического порядка разделов и кошмара имеет высокий риск потери данных.
oldfred avatar
флаг cn
Я использую 20.04 и lsblk перечисляет разделы в порядке номеров. На дисках они не в таком порядке.
heynnema avatar
флаг ru
Я могу подтвердить... 21.10... список lsblk в порядке номеров.
WinEunuuchs2Unix avatar
флаг in
@waltinator Согласен, это непростая задача. Но когда что-то не дает вам покоя годами, вы просто не можете устоять перед желанием это исправить. Я только что опубликовал решение.
WinEunuuchs2Unix avatar
флаг in
@heynnema Раньше я стирал и переустанавливал. Последние пять лет я стал бояться этого процесса :( Я больше доволен тем, что трачу свое свободное время на разработку программного обеспечения. Кстати, я только что опубликовал ответ.
WinEunuuchs2Unix avatar
флаг in
@oldfred Когда вы вводите `lsblk --version`, что он говорит? И похож ли вывод на мой ответ, который я только что опубликовал ниже?
Terrance avatar
флаг id
@WinEunuuchs2Unix `lsblk из util-linux 2.34`
heynnema avatar
флаг ru
@WinEunuuchs2Unix от 21.10... `lsblk из util-linux 2.36.1`
heynnema avatar
флаг ru
@WinEunuuchs2Unix re: *"Раньше я стирал и переустанавливал.Последние пять лет я стал бояться этого процесса"*... ​​в чем проблема?
WinEunuuchs2Unix avatar
флаг in
@heynnema Проблема в том, что я забыл многие программы, которые мне нужно переустановить, и как настроить их для работы так, как я предпочитаю. Мой следующий проект будет заключаться в новой установке 22.04 и автоматической переустановке всех программ в старом разделе, а также в переносе данных из старого раздела. Также добавьте файлы конфигурации `/etc` и `~/.config/` из старого раздела. Проще говоря, мне это нужно, потому что A) я забыл, что я установил, или B) мне лень делать это по одной, или C) пропуск нескольких LTS-версий или Minor-версий одновременно.
heynnema avatar
флаг ru
@WinEunuuchs2Unix Возможно, вы сможете использовать Synaptic **Generate Package Download Script** (меню «Файл»), чтобы автоматизировать некоторые из этих операций.
WinEunuuchs2Unix avatar
флаг in
@heynnema Спасибо за совет. Я бы предпочел не полностью «изобретать велосипед», потому что первые несколько версий имеют тенденцию быть квадратными и вообще не катятся.
heynnema avatar
флаг ru
@ WinEunuuchs2Unix Я не совсем понимаю, что вы имеете в виду.
oldfred avatar
флаг cn
Только потому что попросили, раз иначе решили. fred@z170-focal-k:~$ lsblk --версия `lsblk из util-linux 2.34`
Рейтинг:3
флаг in

В итоге я написал общую функцию сортировки для решения проблемы.

Новый лсблк Порядок сортировки

$ лсдрв | сблк

НАИМЕНОВАНИЕ ТИП FS ЭТИКЕТКА ТОЧКА КРЕПЛЕНИЯ РАЗМЕР МОДЕЛЬ
nvme0n1 477G Твердотельный накопитель Samsung 960 PRO 512 ГБ               
âânvme0n1p1 нтфс 450M 
âânvme0n1p2 vfat /boot/efi 99M 
âânvme0n1p3 16M 
âânvme0n1p4 ntfs NVMe_Win10 /mnt/c 363.2G 
âânvme0n1p5 нтфс 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] 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 

Bash-скрипт для сортировки лсблк вывод

Чтобы найти решение, потребовалось несколько часов гугления различных команд bash. Сценарий bash, изначально называвшийся сблк, могут быть адаптированы для других целей:

#!/бин/баш
# Спросите Ubuntu: https://askubuntu.com/questions/1392560/how-to-change-lsblk-sort-order
oIFS="$IFS" # Сохранить IFS
ЕСЛИ='|' # Используйте "|" как разделитель массива
declare -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 отсортировано < <( 
        эхо "${partitions[*]}" | тр "|" "\п" | сортировать | тр "\n" "|" )
    last_i=$(( ${#sorted[@]} - 1 )) # Последний отсчитываемый от 0 индекс в отсортированном массиве

    for ((i=0; i <= $last_i; i++)); делать
        line="${sorted[i]}" # Получить строку массива с индексом, начинающимся с 0
        line="${line:2}" # Убираем ключ сортировки "99"
        если [[ $i -lt $last_i ]]; тогда
            echo "ââ$line" # Напечатать строку, которая не является последней строкой
        еще
            echo "ââ$line" # Напечатать последнюю строку
        фи
    сделано
    partitions=() # Пустой массив разделов для следующего диска
}

# Основной цикл
при чтении строки
делать
    первый = "$ {строка: 0: 2}"
    если [[ "$first" == "ââ" || "$first" == "ââ" ]]; тогда
        add_part "$line" # Добавить специальную строку в массив разделов

        если [[ "$first" == "ââ" ]]; тогда
            sort_parts # Последний раздел. Сортировка и печать массива
        фи
    еще
        echo "$line" # Просто напечатать обычную строку
    фи

done < "${1:-/dev/stdin}" # Чтение из файла $1 или из стандартного ввода


IFS="$oIFS" # Восстановить старый IFS
Terrance avatar
флаг id
Очень хороший! Не нужно беспокоиться о версии `lsblk`. +1 мой друг! :)
heynnema avatar
флаг ru
+1 за настойчивость :-)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.