Unix's 'ls' sortuj według nazwy

127

Czy możesz sortować listę ls według nazwy?

Devang Kamdar
źródło
10
Jeśli nie sortuje według nazwy bez żadnych argumentów, możesz chcieć sprawdzić, czy ls ma alias do czegoś innego, lub po prostu wywołać go przy użyciu pełnej ścieżki, co wyeliminowałoby wszelkie istniejące aliasy.
tvanfosson
gnu-coreutils ls sortuje domyślnie. Jakiego systemu używasz (jak pytali inni)
Nick Fortescue
Czy na pewno pytasz o sortowanie według nazwy, a nie typu (tj. Najpierw katalog, potem pliki)?
curtisk
Wielkie litery występują przed małymi literami, więc plik Z znajduje się przed plikiem a ... jak mogę to naprawić?
ArtOfWarfare
Strona podręcznika mówi „posortowane oddzielnie i w porządku leksykograficznym”. Pliki są sortowane według pierwszego znaku: numeryczne [0..9] i WIELKIE znaki [A..Z] i dolne znaki [a..z]
Gürol Canbek

Odpowiedzi:

131

Mój ls sortuje domyślnie według nazwy. Co widzisz?

man ls stwierdza:

List information about the FILEs (the current directory by default). Sort entries alpha‐betically if none of -cftuvSUX nor --sort is specified.:

Wynicować
źródło
lsnie sortuje, jeśli -c1określono: czy istnieje sposób, aby to zrobić? ( --sort=namenie wydaje się działać)
dhc
1
To nie jest prawda. z ls -la, widzę .bashrc - can - .config - Downloads - .local - tmp.bashrc - .config - .local - Downloads - can - tmp
:,
1
mój mówi, że 100.jpg występuje przed 10.jpg. Myślę, że ma sens, jeśli „0” występuje przed „”. ale nadal nie jest to intuicyjne
chiliNUT
Widzę „M” przed „b”. Zmieszany. Czekaj, czy wielkość liter ma znaczenie?
Daniel Springer
106

Aby uzyskać coś prostego, możesz połączyć ls z sort . Tylko lista nazw plików:
ls -1 | sortować

Aby posortować je w odwrotnej kolejności:
ls -1 | sort -r

znak
źródło
3
Czy istnieje sposób na sortowanie plików w ten sposób: ls | sort -n 1.1.1; 1.1.2; 1.1.3; 2.10.1; 2.10.15; 2.10.2; 2.10.20; 2.10.21; 2.1.1; 2.1.10; 2.1.15; 2.1.2; 2.1.3; 2.1.4; 10.1.1; 10.1.2; 10.1.3; 11.0.1; 11.0.2; 11.0.20; 11.0.21; 11.0.22; Jak widać 2.10.15 przed 2.10.2 .
BBK,
Zajmuję się programowaniem na Androida na urządzeniu Pidion, a ls nie sortuje automatycznie, więc to było bardzo pomocne! Jedynym problemem jest to, że wygląda na to, że sortuje miękkie linki, ale z jakiegoś powodu nie sortuje plików
Mitch
Na komputerze Mac wygląda na to, że drugie polecenie można skrócić do ls -1r.
Ash Ryan Arnwine
4
@BBK sort -V posortuje według numerów wersji, więc otrzymasz .. 2.10.2; 2.10.15; .. from man sort .. --sort = WORD posortuje według WORD: general-numeric -g, human-numeric -h, month -M, numeric -n, random -R, version -V
mosh
35

lsfrom domyślnie coreutilswykonuje sortowanie z uwzględnieniem ustawień regionalnych i dlatego w niektórych przypadkach może dawać zaskakujące wyniki (na przykład %foosortuje między bari quuxw LANG=en_US). Jeśli chcesz sortować ASCIIbetical, użyj

LANG=C ls
Richarda Smitha
źródło
LANGnie znając zachowania sortowania, ten post bardzo mi pomógł!
yurenchen
U mnie to też zadziałało. czy mógłbyś to rozwinąć? Dlaczego wygląda inaczej?
Kostas
1
Ta dawka działa, ale jest wyświetlana ?dla każdego znaku innego niż ASCII, gdy wyjście jest terminalem (zła funkcja ls sprawdza, czy wychodzi do terminala, działa podczas potoku). Możesz to "naprawić" za pomocą pipingu do cat, użyć C.UTF-8ustawień regionalnych (jeśli twój system je obsługuje) i / lub użyć -bflagi. Nawet lepiej, wcale nie używaj ls, lepiej używaj ''
12431234123412341234123
Pomogło mi to odkryć, że problem polegał na tym, że niektóre z moich nazw plików zawierały łącznik (-), a niektóre półpauza (-). lssortuje łączniki przed pół kreskami.
Jamy Mahabier
17

Piękno narzędzi * nix polega na tym, że można je łączyć:

ls -l | sort -k9,9

Wynik ls -lbędzie wyglądał następująco

-rw-rw-r-- 1 luckydonald luckydonald  532 Feb 21  2017 Makefile
-rwxrwxrwx 1 luckydonald luckydonald 4096 Nov 17 23:47 file.txt

Więc 9,9sortujesz kolumny 9do kolumny 9, będącej nazwami plików. Musisz podać, gdzie się zatrzymać, czyli w tym przypadku jest to ta sama kolumna. Kolumny zaczynają się od 1.

Ponadto, jeśli chcesz zignorować duże / małe litery, dodaj --ignore-casedo polecenia sortowania.

user491575
źródło
1
Co to -k9,9znaczy?
luckydonald
Okazało się, że oznacza to sortowanie kolumny 9do tej samej kolumny 9. Normalne lswyjście wygląda drwx------ 8 999 user 4.0K Feb 5 2017 file.txttak:, więc kolumna 9 to nazwy plików. Jeśli chcesz zignorować wielkość liter, użyj opcji --ignore-casesort.
luckydonald
8

UWAGA: „a” pojawia się PO „Z”:

$ touch A.txt aa.txt Z.txt

$ ls

A.txt Z.txt aa.txt

russian_spy
źródło
3
To nie zawsze jest prawdą. Nie znam dokładnie okoliczności, które sprawiają, że to nieprawda, ale na moim komputerze z systemem Ubuntu 12.04 dane wyjściowe ls są sortowane alfabetycznie (ignorując wielkość liter).
Patrick James McDougle,
Dobry chwyt! Wygląda na to, że zamawia go na podstawie kodu ASCII. Po dużych literach następuje małe litery ..
Kent Pawar
1
Zauważyłem, że mój MacOS sortuje najpierw cyfry, potem wielkie litery, potem podkreślenie, a potem małe litery. To zabawne, że nie rozróżniają wielkości liter. Z drugiej strony, mój Debian rozróżnia małe i duże litery, ale sortuje je bez uwzględnienia, chyba że jest remis, wtedy małe litery wygrywają! Przykład: ABA.txt ABb.txt aBC.txt AbC.txt ABc.txt
zk82
Ja też mam MAC. byłem rozczarowany, widząc sortowanie typu A, Z, a, z. Jestem tutaj, ponieważ wolę mieć A, a, Z, a. dzięki za wskazówkę. wypróbuje normaltutaj rozwiązania.
nyxee
8

Pliki różniące się tylko ciągiem liczbowym mogą być sortowane według tej liczby pod warunkiem, że jest poprzedzona separatorem.

W takim przypadku można użyć następującej składni:

ls -x1 file | sort -t'<char>' -n -k2

Przykład:

ls -1 TRA*log | sort -t'_' -n -k2

TRACE_1.log
TRACE_2.log
TRACE_3.log
TRACE_4.log
TRACE_5.log
TRACE_6.log
TRACE_7.log
TRACE_8.log
TRACE_9.log
TRACE_10.log
poney
źródło
4

Ze strony podręcznika (dla bash ls):

Sortuj wpisy alfabetycznie, jeśli nie ma opcji -cftuSUX ani --sort.

jwoolard
źródło
3
Nie ma „bash ls”. Zrób „który jest”
Norbert Hartl
@Norbert: Masz rację, ale which lsodniesiesz sukces, nawet gdyby bash miał wbudowany ls. Raczej zrób builtin lsbash i otrzymaj błąd.
Pianosaurus
4
@Norbert: whichzawsze zwraca ścieżkę. Służy type lsdo określania, co myśli powłoka ls(wbudowane, funkcyjne, wykonywalne).
ephemient
3

lsNarzędzie powinno być zgodne z IEEE Std 1003.1-2001 ( POSIX.1), który stanowi:

22027: będzie sortować oddzielnie argumenty katalogowe i niekatalogowe, zgodnie z kolejnością zestawiania w bieżących ustawieniach regionalnych.

26027: Domyślnie format jest nieokreślony, ale dane wyjściowe powinny być posortowane alfabetycznie według nazwy symbolu:

  • Nazwa biblioteki lub obiektu, jeśli podano -A
  • Nazwa symbolu
  • Typ symbolu
  • Wartość symbolu
  • Rozmiar powiązany z symbolem, jeśli dotyczy
kenorb
źródło
2

Sprawdź, czy w .bashrcpliku nie ma aliasów.

Sujit
źródło
7
Wystarczyło napisać, aliasaby sprawdzić wszystkie aktualne aliasy.
Krzysztof Jabłoński
2

ls -X działa w tym celu, na wypadek gdybyś aliasował ls do bardziej użytecznego ustawienia domyślnego.

jezzo
źródło
0
In Debian Jessie, this works nice:

ls -lah --group-directories-first

# l=use a long listing format
# a=do not ignore entries starting with .
# h=human readable
# --group-directories-first=(obvious)
# Note: add -r for reverse alpha

# You might consider using lh by appending to ~/.bashrc as the alias:
~$ echo "alias lh='ls -lah --group-directories-first'" >>~/.bashrc
# -- restart your terminal before using lh command --
James T.
źródło