Le ls comando elenca i file su un sistema POSIX. È un comando semplice, spesso sottovalutato, non in quello che può fare (perché in realtà fa solo una cosa), ma in come puoi ottimizzarne l'uso.
Dei 10 comandi terminali più essenziali da conoscere, l'umile ls command è tra i primi tre, perché ls non solo list file, ti dice informazioni importanti su di loro. Ti dice cose come chi possiede un file o una directory, quando ogni file è stato perso o modificato e persino che tipo di file è. E poi c'è la sua funzione incidentale di darti un'idea di dove ti trovi, quali oggetti vicini sono in giro e cosa puoi farci.
Se la tua esperienza con ls è limitato a qualunque alias la tua distribuzione abbia in .bashrc , allora probabilmente ti stai perdendo.
GNU o BSD?
Prima di esaminare i poteri nascosti di ls , devi determinare quali ls comando che stai eseguendo. Le due versioni più popolari sono la versione GNU, inclusa nelle coreutils GNU pacchetto e la versione BSD. Se stai utilizzando Linux, probabilmente hai ls installato. Se stai utilizzando BSD o MacOS, allora hai la versione BSD. Ci sono differenze, per le quali questo articolo tiene conto.
Puoi scoprire quale versione è sul tuo computer con --version opzione:
$ ls --version
Se questo restituisce informazioni sulle coreutils GNU, allora hai la versione GNU. Se restituisce un errore, probabilmente stai eseguendo la versione BSD (esegui man ls | head certo).
Dovresti anche esaminare quali preset potrebbero avere la tua distribuzione. Le personalizzazioni dei comandi del terminale vengono spesso inserite in $HOME/.bashrc o $HOME/.bash_aliases o $HOME/.profile , e si ottengono con l'alias ls a un ls più complesso comando. Ad esempio:
alias ls='ls --color'
I preset forniti dalle distribuzioni sono molto utili, ma rendono difficile discernere cosa l fa da solo e cosa forniscono le sue opzioni aggiuntive. Se mai volessi eseguire ls e non l'alias, puoi "sfuggire" al comando con una barra rovesciata:
$ \ls
Classifica
Corri da solo, ls elenca semplicemente i file in tutte le colonne che possono stare nel tuo terminale:
$ ls ~/example
bunko jdk-10.0.2
chapterize otf2ttf.ff
despacer overtar.sh
estimate.sh pandoc-2.7.1
fop-2.3 safe_yaml
games tt
È un'informazione utile, ma tutti quei file sembrano sostanzialmente uguali senza la comodità delle icone per comunicare rapidamente quale è una directory, un file di testo o un'immagine e così via.
Usa la -F (o --classifica su GNU) per mostrare gli indicatori dopo ogni voce che identificano il tipo di file che è:
$ ls ~/example
bunko jdk-10.0.2/
chapterize* otf2ttf.ff*
despacer* overtar.sh*
estimate.sh pandoc@
fop-2.3/ pandoc-2.7.1/
games/ tt*
Con questa opzione, gli elementi elencati nel tuo terminale sono classificati per tipo di file utilizzando questa abbreviazione:
- Una barra (/ ) denota una directory (o "cartella").
- Un asterisco (* ) denota un file eseguibile. Ciò include un file binario (codice compilato) e script (file di testo con autorizzazione eseguibile).
- Un segno di chiocciola (@ ) denota un collegamento simbolico (o "alias").
- Un segno di uguale (= ) denota un socket.
- Su BSD, un segno di percentuale (% ) denota un whiteout (un metodo di rimozione dei file su determinati file system).
- Su GNU, una parentesi angolare (> ) indica una porta (comunicazione tra processi su Illumos e Solaris).
- Una barra verticale (| ) denota una FIFO.
Una versione più semplice di questa opzione è -p , che differenzia solo un file da una directory.
Lista lunga
Ottenere una "lunga lista" da ls è così comune che molte distribuzioni alias ll a ls -l . Il modulo elenco lungo fornisce molti importanti attributi di file, come autorizzazioni, l'utente che possiede ciascun file, il gruppo a cui appartiene il file, la dimensione del file in byte e la data dell'ultima modifica del file:
$ ls -l
-rwxrwx---. 1 seth users 455 Mar 2 2017 estimate.sh
-rwxrwxr-x. 1 seth users 662 Apr 29 22:27 factorial
-rwxrwx---. 1 seth users 20697793 Jun 29 2018 fop-2.3-bin.tar.gz
-rwxrwxr-x. 1 seth users 6210 May 22 10:22 geteltorito
-rwxrwx---. 1 seth users 177 Nov 12 2018 html4mutt.sh
[...]
Se non pensi in byte, aggiungi -h flag (o --umano in GNU) per tradurre le dimensioni dei file in una notazione più umana:
$ ls --human
-rwxrwx---. 1 seth users 455 Mar 2 2017 estimate.sh
-rwxrwxr-x. 1 seth seth 662 Apr 29 22:27 factorial
-rwxrwx---. 1 seth users 20M Jun 29 2018 fop-2.3-bin.tar.gz
-rwxrwxr-x. 1 seth seth 6.1K May 22 10:22 geteltorito
-rwxrwx---. 1 seth users 177 Nov 12 2018 html4mutt.sh
Puoi vedere solo un po' meno di informazioni mostrando solo la colonna del proprietario con -o o solo la colonna del gruppo con -g :
$ ls -o
-rwxrwx---. 1 seth 455 Mar 2 2017 estimate.sh
-rwxrwxr-x. 1 seth 662 Apr 29 22:27 factorial
-rwxrwx---. 1 seth 20M Jun 29 2018 fop-2.3-bin.tar.gz
-rwxrwxr-x. 1 seth 6.1K May 22 10:22 geteltorito
-rwxrwx---. 1 seth 177 Nov 12 2018 html4mutt.sh
Combina entrambe le opzioni per non mostrare nessuna.
Formato di ora e data
Il formato elenco lungo di ls di solito ha questo aspetto:
-rwxrwx---. 1 seth users 455 Mar 2 2017 estimate.sh
-rwxrwxr-x. 1 seth users 662 Apr 29 22:27 factorial
-rwxrwx---. 1 seth users 20697793 Jun 29 2018 fop-2.3-bin.tar.gz
-rwxrwxr-x. 1 seth users 6210 May 22 10:22 geteltorito
-rwxrwx---. 1 seth users 177 Nov 12 2018 html4mutt.sh
I nomi dei mesi non sono facili da ordinare, sia computazionalmente che (a seconda che il tuo cervello tenda a preferire stringhe o numeri interi) per riconoscimento. Puoi modificare il formato del timestamp con lo --stile dell'ora opzione più il nome di un formato. I formati disponibili sono:
- iso pieno (01-01-1970 21:12:00)
- iso lungo (01-01-1970 21:12)
- iso (01-01 21:12)
- locale (usa le tue impostazioni locali)
- posix-STYLE (sostituisci STYLE con una definizione locale)
Puoi anche creare uno stile personalizzato utilizzando la notazione formale della data comando.
Ordina per ora
Di solito, le ls il comando ordina in ordine alfabetico. Puoi ordinarlo in base a quale file è stato modificato più di recente (il più recente è elencato per primo) con -t opzione.
Ad esempio:
$ touch foo bar baz
$ ls
bar baz foo
$ touch foo
$ ls -t
foo bar baz
Tipo di elenco
L'output standard di ls bilancia la leggibilità con l'efficienza dello spazio, ma a volte si desidera che l'elenco dei file sia in una disposizione specifica.
Per un elenco di file separati da virgole, utilizza -m :
ls -m ~/example
bar, baz, foo
Per forzare un file per riga, usa -1 opzione (questa è la numero uno, non una L minuscola):
$ ls -1 ~/bin/
bar
baz
foo
Per ordinare le voci in base all'estensione del file anziché al nome del file, utilizza -X (è una X maiuscola):
$ ls
bar.xfc baz.txt foo.asc
$ ls -X
foo.asc baz.txt bar.xfc
Nascondi il disordine
Ci sono alcune voci in alcune ls inserzioni che potrebbero non interessarti. Ad esempio, i metacaratteri . e .. rappresentano rispettivamente "qui" e "indietro di un livello". Se hai familiarità con la navigazione in un terminale, probabilmente sai già che ogni directory si riferisce a se stessa come . e al suo genitore come .. , quindi non devi ricordartelo costantemente quando usi -a opzione per mostrare i file nascosti.
Per mostrare quasi tutti i file nascosti (il . e .. esclusi), utilizzare la -A opzione:
$ ls -a
.
..
.android
.atom
.bash_aliases
[...]
$ ls -A
.android
.atom
.bash_aliases
[...]
Con molti buoni strumenti Unix, c'è una tradizione nel salvare i file di backup aggiungendo un carattere speciale al nome del file che viene salvato. Ad esempio, in Vim, i backup vengono salvati con ~ carattere aggiunto al nome.
Questo tipo di file di backup mi ha salvato da errori stupidi in diverse occasioni, ma dopo anni passati a godere del senso di sicurezza che forniscono, non sento il bisogno di avere prove visive della loro esistenza. Mi fido delle applicazioni Linux per generare file di backup (se affermano di farlo) e sono felice di credere che esistano.
Per nascondere i file di backup dalla visualizzazione, usa -B o --ignora i backup per nascondere i formati di backup comuni (questa opzione non è disponibile in BSD ls ):
$ ls
bar.xfc baz.txt foo.asc~ foo.asc
$ ls -B
bar.xfc baz.txt foo.asc
Naturalmente, il file di backup esiste ancora; è solo filtrato in modo da non doverlo guardare.
GNU Emacs salva i file di backup (se non diversamente configurato) con un carattere hash (# ) all'inizio e alla fine del nome del file (#file# ). Altre applicazioni potrebbero utilizzare uno stile diverso. Non importa quale modello viene utilizzato, perché puoi creare le tue esclusioni con --hide opzione:
$ ls
bar.xfc baz.txt #foo.asc# foo.asc
$ ls --hide="#*#"
bar.xfc baz.txt foo.asc
Elenca le directory con ricorsione
I contenuti delle directory non sono elencati con ls comando a meno che tu non esegua ls su quella directory in particolare:
$ ls -F
example/ quux* xyz.txt
$ ls -R
quux xyz.txt
./example:
bar.xfc baz.txt #foo.asc# foo.asc
Rendilo permanente con un alias
Le ls command è probabilmente il comando usato più spesso durante una data sessione di shell. Sono i tuoi occhi e le tue orecchie, che ti forniscono il contesto e confermano i risultati dei comandi. Sebbene sia utile avere molte opzioni, fa parte della bellezza di ls è la sua brevità:due caratteri e il tasto Invio, e sai esattamente dove sei e cosa c'è nelle vicinanze. Se devi fermarti a pensare (molto meno a digitare) diverse opzioni, diventa meno conveniente, quindi in genere anche le opzioni più utili vengono tralasciate.
La soluzione è alias i tuoi ls comando in modo che quando lo usi, ottieni le informazioni a cui tieni di più.
Per creare un alias per un comando nella shell Bash, crea un file nella tua home directory chiamato .bash_aliases (è necessario includere il punto all'inizio). In questo file, elenca il comando per cui desideri creare un alias e quindi l'alias che desideri creare. Ad esempio:
alias ls='ls -A -F -B --human --color'
Questa riga fa sì che la tua shell Bash interpreti ls comando come ls -A -F -B --human --color .
Non sei limitato a ridefinire i comandi esistenti. Puoi creare i tuoi alias:
alias ll='ls -l'
alias la='ls -A'
alias lh='ls -h'
Affinché gli alias funzionino, la tua shell deve sapere che .bash_aliases esiste il file di configurazione. Apri il .bashrc file in un editor (o crealo, se non esiste) e includi questo blocco di codice:
if [ -e $HOME/.bash_aliases ]; then
source $HOME/.bash_aliases
fi
Ogni volta .bashrc viene caricato (ovvero ogni volta che viene avviata una nuova shell Bash), Bash caricherà .bash_aliases nel tuo ambiente. Puoi chiudere e riavviare la tua sessione Bash o semplicemente forzarla a farlo ora:
$ source ~/.bashrc
Se dimentichi se hai assegnato un alias a un comando, il che comando ti dice:
$ which ls
alias ls='ls -A -F -B --human --color'
/usr/bin/ls
Se hai alias ls comando a se stesso con le opzioni, puoi sostituire il tuo alias in qualsiasi momento prefacendo ls con una barra rovesciata. Ad esempio, nell'alias di esempio, i file di backup vengono nascosti utilizzando -B opzione, il che significa che non è possibile eseguire il backup dei file con ls comando. Sostituisci l'alias per vedere i file di backup:
$ ls
bar baz foo
$ \ls
bar baz baz~ foo
Fai una cosa e falla bene
Le ls comando ha un numero sbalorditivo di opzioni, molte delle quali sono di nicchia o fortemente dipendenti dal terminale in uso. Dai un'occhiata a info ls su sistemi GNU o man ls su sistemi GNU o BSD per ulteriori opzioni.
Potresti trovare strano che un sistema famoso per la premessa che ogni strumento "fa una cosa e la fa bene" appesantirebbe il suo comando più comune con 50 opzioni. Ma ls fa solo una cosa:elenca i file. E con 50 opzioni che ti consentono di controllare come ricevi quell'elenco, ls fa il suo unico lavoro molto, molto bene.