Puncte:3

Cum se schimbă ordinea de sortare a `lsblk`?

drapel in

Schimbare lsblk ordinea de sortare

lsblk sortează partițiile într-o ordine greu de urmat. O metodă de sortare fără a fi nevoie să scrieți un script bash sau un script python ar fi prima alegere.

O întrebare similară a fost pusă în Unix și Linux:

Cu toate acestea, răspunsul acolo pentru a utiliza -x NUME parametrul de sortare face ca indentarea arborelui să dispară.

Ordinea de sortare curentă

Acesta este cum lsblk afișează acum:

$ lsdrv

NUME FSTYPE ETICĂ MOUNTPOINT DIMENSIUNE 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 Imagine 11.4G 
ââsda3 ntfs HGST_Win10 /mnt/d 919G 
ââsda1 vfat ESP 500M 

Ordinea de sortare propusă

Așa este lsblk ar trebui sortat:

$ lsdrv

NUME FSTYPE ETICĂ MOUNTPOINT DIMENSIUNE 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 Imagine 11.4G 

Notă: lsdrv este un alias definit în ~/.bashrc:

$ alias lsdrv

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

rezumat

Complexitățile schimbării ordinii de sortare sunt:

  • Doar partiții cu caractere de desen de linie ââ și ââ sunt sortate sub unitățile lor.
  • După sortarea partițiilor, ultima partiție poate avea nevoie ââ inlocuit cu ââ.
  • După sortarea partițiilor, poate fi nevoie de prima partiție până la a doua ultima partiție ââ inlocuit cu ââ.
  • Bătrânii "Călcâiul lui Ahile" a locurilor de sortare 10 după 1 , DE EXEMPLU. 1 atunci 10 atunci 2 . Într-adevăr 9 ar trebui să apară înainte 10.

Ordinea de sortare a lsblk a fost un spin de ani de zile. Sperăm că cineva are o soluție simplă cu utilitare GNU precum: awk, sed, grep, unic și/sau fel, etc.

waltinator avatar
drapel it
Citiți `man stat`, puteți scrie propriul dvs. `lsblk`-like cu propriul format de ieșire
Terrance avatar
drapel id
`lsblk --tree -x NUME | grep -v loop` ar trebui să funcționeze bine, dar nu sunt sigur cum să listez ca nvme0n1p2 înainte de nvme0n1p10, deoarece ordinea de sortare este după prima și a doua cifră. Hmmmmmm
WinEunuuchs2Unix avatar
drapel in
@Terrance Versiunea `lsblk din util-linux 2.27.1` dă un mesaj de eroare cu parametrul `--tree`: `lsblk: opțiunea nerecunoscută '--tree'`. Ce versiune de `lsblk` folosești? DE EXEMPLU. `lsblk --version`.
WinEunuuchs2Unix avatar
drapel in
@waltinator În loc să scrieți o nouă comandă de la zero cu comanda `stat`, ar putea fi mai ușor să luați codul sursă `lsblk` și să îl modificați.
heynnema avatar
drapel ru
Bănuiesc că lsblk arată partițiile în ordinea fizică reală, așa cum se găsesc pe disc. Dacă acest lucru este corect, atunci chiar nu doriți să le sortați doar pentru a arăta frumos. De asemenea, se pare că oricum ai putea avea un coșmar de partiționare. Îmi pare rău. Ce arată gparted?
WinEunuuchs2Unix avatar
drapel in
@heynnema Dar îmi place destul de :) `gparted` arată un coșmar și această întrebare a fost pusă în timpul unui proiect pentru a începe fuzionarea partițiilor împreună pentru instalarea Ubuntu 22.04 LTS. În ceea ce privește modul în care `lsblk` le afișează acum, s-ar putea să ai dreptate, dar asta nu mă privește în acest moment...
heynnema avatar
drapel ru
Ai alergat pe 22.04? Și renunț la 16.04 și 18.04? Asta e blasfemie! Chicoti. Nu îmbina partițiile... șterge-l și începe din nou... scapă de coșmar.
waltinator avatar
drapel it
A face cu „imprimarea destul de” cu instrumentele de procesare a textului este greu și nu merită niciodată efortul. Ignorarea ordinii efective de partiție și a coșmarului are un risc mare de pierdere a datelor.
oldfred avatar
drapel cn
Folosesc 20.04 și lsblk listează partițiile în ordine numerică. Nu sunt în această ordine pe drive-uri.
heynnema avatar
drapel ru
Pot confirma... pe 21.10... liste lsblk în ordine numerică.
WinEunuuchs2Unix avatar
drapel in
@waltinator Sunt de acord că nu este o sarcină simplă. Dar când ceva te deranjează ani de zile, pur și simplu nu poți rezista impulsului de a-l repara. Tocmai am postat o solutie.
WinEunuuchs2Unix avatar
drapel in
@heynnema obișnuiam să șterg și să reinstalez. În ultimii cinci ani am ajuns să mă tem de proces :( Sunt mai mulțumit să-mi petrec timpul liber dezvoltând software. BTW am postat un răspuns chiar acum.
WinEunuuchs2Unix avatar
drapel in
@oldfred Când tastați `lsblk --version` ce scrie? Și rezultatul arată similar cu răspunsul meu pe care tocmai l-am postat mai jos?
Terrance avatar
drapel id
@WinEunuuchs2Unix `lsblk din util-linux 2.34`
heynnema avatar
drapel ru
@WinEunuuchs2Unix din 21.10... `lsblk din util-linux 2.36.1`
heynnema avatar
drapel ru
@WinEunuuchs2Unix re: *"Obișnuiam să ștergeam și să reinstalam.În ultimii cinci ani am ajuns să mă tem de proces"*... ​​care a fost problema?
WinEunuuchs2Unix avatar
drapel in
@heynnema Problema este că am uitat multe programe pe care trebuie să le reinstalez și cum să le configurez pentru a funcționa în modul pe care îl prefer. Următorul meu proiect va fi să instalez proaspăt 22.04 și să reinstalez automat toate programele de pe o partiție veche și să aduc date din partiția veche. De asemenea, introduceți fișierele de configurare `/etc` și `~/.config/` din vechea partiție. Pur și simplu, am nevoie de asta pentru că A) Am uitat ce am instalat sau B) Îmi este prea lene să o fac eu unul câte unul sau C) Omit mai multe versiuni LTS sau versiuni minore simultan.
heynnema avatar
drapel ru
@WinEunuuchs2Unix Este posibil să puteți utiliza `Synaptic's` **Generare script de descărcare a pachetului** (meniul Fișier) pentru a automatiza o parte din acestea.
WinEunuuchs2Unix avatar
drapel in
@heynnema Mulțumesc pentru pont. Aș prefera să nu „reinventez roata” total pentru că primele versiuni tind să fie pătrate și să nu se rostogolească deloc.
heynnema avatar
drapel ru
@WinEunuuchs2Unix Nu prea înțeleg ce vrei să spui.
oldfred avatar
drapel cn
Doar pentru că a cerut, deoarece altfel rezolvat. fred@z170-focal-k:~$ lsblk --version `lsblk din util-linux 2.34`
Puncte:3
drapel in

Am ajuns să scriu o funcție de sortare generică pentru a rezolva problema.

Nou lsblk ordinea de sortare

$ lsdrv | sblk

NUME FSTYPE ETICĂ MOUNTPOINT DIMENSIUNE 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 Imagine 11.4G 

Script Bash pentru a sorta lsblk ieșire

A fost nevoie de câteva ore de căutare pe Google a diferitelor comenzi bash pentru a găsi o soluție. Scriptul bash, numit inițial sblk, poate fi adaptat în alte scopuri:

#!/bin/bash
# Întrebați Ubuntu: https://askubuntu.com/questions/1392560/how-to-change-lsblk-sort-order
oIFS="$IFS" # Salvați IFS
IFS='|' # Folosiți „|” ca delimitator de matrice
declare -a partitions=() # Matrice de partiții pentru o unitate dată

add_part () {
    line="$1" # Parametrul confuz $1 devine evident
    part=${line%% *} # obține numele partiției, apoi obține numărul
    cheie=$(echo "$parte" | grep -Eo '[0-9]+$')

    # Dacă lungimea numărului este mai mică de 2, adăugați „0”
    dacă [[ "${#key}" < 2 ]]; atunci
        key="0$key" # Adăugați „0” la o singură cifră
    fi

    line="${line:2}" # Eliminați caracterul arborelui
    partiții+=( "$key$line" ) # Linia veche "ââ..." acum intrarea matricei "99..."
}

sort_parts () {
    # Sortați matricea de partiții cu cheia de sortare în noua matrice „sortată”.
    citește -r -d '' -a sortat < <( 
        echo „${partiții[*]}” | tr "|" „\n” | sortare | tr "\n" "|" )
    last_i=$(( ${#sorted[@]} - 1 )) # Ultimul index bazat pe 0 din tabloul sortat

    pentru ((i=0; i <= $ultimul_i; i++)); do
        line="${sorted[i]}" # Obțineți linia matrice la indexul bazat pe 0
        line="${line:2}" # Eliminați cheia de sortare „99”
        if [[ $i -lt $last_i ]]; atunci
            echo "ââ$line" # Imprimă o linie care nu este ultima linie
        altfel
            echo "ââ$line" # Imprimă ultima linie
        fi
    Terminat
    partitions=() # Matrice de partiții goală pentru următoarea unitate
}

# Bucla principală
în timp ce linia citită
do
    first="${line:0:2}"
    dacă [[ "$primul" == "ââ" || „$primul” == „ââ" ]]; atunci
        add_part "$line" # Adăugați o linie specială la matricea de partiții

        dacă [[ "$primul" == "ââ" ]]; atunci
            sort_parts # Ultima partiție. Sortați și imprimați matrice
        fi
    altfel
        echo "$line" # Pur și simplu imprimați o linie obișnuită
    fi

done < "${1:-/dev/stdin}" # Citiți din fișierul $1 sau din intrarea standard


IFS="$oIFS" # Restaurați vechiul IFS
Terrance avatar
drapel id
Foarte bine! Nu trebuie să vă faceți griji cu privire la versiunea `lsblk`. +1 prietenul meu! :)
heynnema avatar
drapel ru
+1 pentru persistență :-)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.