La "ls" di Unix ordina per nome


127

Puoi ordinare un elenco di ls per nome?


10
Se non sta ordinando per nome senza alcun argomento, potresti voler controllare se ls è stato alias per qualcos'altro, o semplicemente invocarlo usando il percorso completo che eliminerebbe gli alias esistenti.
tvanfosson

gnu-coreutils ls ordina per impostazione predefinita. Quale sistema stai usando (come altri hanno chiesto)
Nick Fortescue

Sei sicuro di chiedere di ordinare per nome e non per tipo (es. Directory prima poi file) ??
curtisk

Le lettere maiuscole vengono prima delle lettere minuscole, quindi il file Z viene prima del file a ... come posso risolverlo?
ArtOfWarfare

pagina man dice "ordinato separatamente e in ordine lessicografico". I file sono ordinati in base al primo carattere: numerico [0..9] e caratteri MAIUSCOLI [A..Z] e caratteri bassi [a..z]
Gürol Canbek

Risposte:


131

Il mio ls ordina per nome per impostazione predefinita. Cosa stai vedendo?

man ls stati:

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


lsnon ordina se -c1specificato: c'è un modo per ottenerlo? ( --sort=namenon sembra funzionare)
dhc

1
Quello non è vero. con ls -la, vedo .bashrc - can - .config - Downloads - .local - tmp.bashrc - .config - .local - Downloads - can - tmp
:, l'

1
il mio dice che 100.jpg viene prima di 10.jpg. Ha senso suppongo che "0" venga prima di "." ma non è ancora intuitivo
chiliNUT

Vedo "M" prima di "b". Confuso. Aspetta, le maiuscole sono importanti?
Daniel Springer

106

Per qualcosa di semplice, puoi combinare ls con sort . Solo per un elenco di nomi di file:
ls -1 | ordinare

Per ordinarli in ordine inverso:
ls -1 | sort -r


3
C'è un modo per ordinare i file in questo modo: 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; Come puoi vedere 2.10.15 prima del 2.10.2 .
BBK

Sto sviluppando un po 'di Android su un dispositivo Pidion e ls non si ordina automaticamente, quindi è stato molto utile! L'unico problema è che sembra che ordina i collegamenti software ma non ordina i file, per qualche motivo
Mitch

Su Mac, sembra che il secondo comando possa essere abbreviato in ls -1r.
Ash Ryan Arnwine

4
@BBK sort -V ordinerà per numero di versione, quindi ottieni .. 2.10.2; 2.10.15; .. from man sort .. --sort = WORD ordinerà in base a WORD: general-numeric -g, human-numeric -h, month -M, numeric -n, random -R, versione -V
mosh

35

lsda coreutilsesegue un locale-consapevole ordinamento di default, e quindi può produrre risultati sorprendenti in alcuni casi (ad esempio, %fooordinerà tra bare quuxin LANG=en_US). Se vuoi un ordinamento ASCIIbetico, usa

LANG=C ls

LANGilfnuence il comportamento di ordinamento, questo post mi aiuta molto!
yurenchen

Questo ha funzionato anche per me. potresti approfondire questo? Perché si ordina in modo diverso?
Kostas

1
Questa dose funziona, ma produce l'output ?per ogni carattere non ASCII quando l'output è un terminale (una cattiva funzionalità di ls controlla se esce su un terminale, funziona durante il piping). Puoi "aggiustarlo" con piping a cat, usare il C.UTF-8locale (se il tuo sistema lo supporta) e / o usare il -bflag. Ancora meglio, non usare lsaffatto, meglio usare `
12431234123412341234123

Questo mi ha aiutato a scoprire che per me il problema era che alcuni dei miei nomi di file contenevano un trattino (-) e alcuni un trattino (-). lsordina i trattini prima dei trattini.
Jamy Mahabier

17

Il bello degli strumenti * nix è che puoi combinarli:

ls -l | sort -k9,9

L'output di ls -lsarà simile a questo

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

Quindi 9,9, ordina la colonna 9fino alla colonna 9, essendo i nomi dei file. Devi fornire dove fermarti, che in questo caso è la stessa colonna. Le colonne iniziano con 1.

Inoltre, se vuoi ignorare le maiuscole / minuscole, aggiungi --ignore-caseal comando di ordinamento.


1
Cosa -k9,9significa?
luckydonald

Trovato, significa ordinare la colonna 9fino alla stessa colonna 9. Un lsoutput normale è simile a questo drwx------ 8 999 user 4.0K Feb 5 2017 file.txt:, quindi la colonna 9 è i nomi dei file. Se vuoi ignorare il caso, usa --ignore-casesu sort.
luckydonald

8

AVVISO: "a" viene DOPO "Z":

$ touch A.txt aa.txt Z.txt

$ ls

A.txt Z.txt aa.txt


3
Questo non è sempre vero. Non conosco esattamente le circostanze che lo rendono non vero, ma sulla mia macchina che esegue Ubuntu 12.04 l'output di ls è ordinato alfabeticamente (ignorando il caso).
Patrick James McDougle

Buona pesca! Sembra che lo stia ordinando in base al codice ASCII .. Gli alfabeti maiuscoli sono seguiti da lettere minuscole ..
Kent Pawar

1
Ho notato che il mio MacOS ordina prima i numeri, poi le lettere maiuscole, poi il trattino basso e poi le lettere minuscole. È divertente che non facciano distinzione tra maiuscole e minuscole. D'altra parte, la mia Debian fa distinzione tra maiuscole e minuscole ma ordina le lettere in modo insensibile a meno che non ci sia un pareggio, quindi vince il minuscolo! Esempio: ABA.txt ABb.txt aBC.txt AbC.txt ABc.txt
zk82

Anch'io sono su un MAC. Sono rimasto deluso nel vedere il tipo di ordinamento A, Z, a, z. Sono qui perché preferisco avere A, a, Z, a. grazie per il tuo suggerimento. proverà le normalsoluzioni qui.
Nyxee

8

I file che differiscono solo da una stringa numerica possono essere ordinati su questo numero a condizione che sia preceduto da un separatore.

In questo caso, è possibile utilizzare la seguente sintassi:

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

Esempio:

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

4

Dalla pagina man (per bash ls):

Ordina le voci in ordine alfabetico se nessuna di -cftuSUX né --sort.


3
Non ci sono "bash ls". Do "which ls"
Norbert Hartl

@Norbert: Hai ragione, ma which lsriusciresti anche se bash avesse un ls incorporato. Piuttosto, fai builtin lsin bash e ottieni un errore.
Pianosaurus

4
@Norbert: whichrestituisce sempre un percorso. Da usare type lsper determinare cosa pensa lssia la shell (built-in, funzione, eseguibile).
effimero

3

L' lsutilità deve essere conforme allo standard IEEE 1003.1-2001 ( POSIX.1) che afferma:

22027: ordina separatamente gli operandi directory e non directory in base alla sequenza di confronto nella locale corrente.

26027: Per impostazione predefinita, il formato non è specificato, ma l'output deve essere ordinato alfabeticamente in base al nome del simbolo:

  • Nome della libreria o dell'oggetto, se è specificato −A
  • Nome del simbolo
  • Tipo di simbolo
  • Valore del simbolo
  • La dimensione associata al simbolo, se applicabile


2

ls -X funziona a tale scopo, nel caso in cui si abbia alias ls su un valore predefinito più utile.


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 --
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.