La sintassi a*
e *a*
viene implementata dalla shell, non dal ls
comando.
Quando si digita
ls a*
al prompt della shell, la shell si espande a*
in un elenco di tutti i file esistenti nella directory corrente i cui nomi iniziano con a
. Ad esempio, potrebbe espandersi a*
nella sequenza a1 a2 a3
e passare quelli come argomenti a ls
. Il ls
comando stesso non vede mai il *
personaggio; si vede solo i tre argomenti a1
, a2
e a3
.
Ai fini dell'espansione dei caratteri jolly, "file" si riferisce a tutte le entità nella directory corrente. Ad esempio, a1
potrebbe essere un file normale, a2
potrebbe essere una directory e a3
potrebbe essere un collegamento simbolico. Hanno tutti voci di directory e l'espansione jolly della shell non interessa a quale tipo di entità si riferiscono quelle voci.
Praticamente tutte le shell che si possono incontrare (bash, sh, ksh, zsh, csh, tcsh, ...) implementano i caratteri jolly. I dettagli possono variare, ma la sintassi di base della *
corrispondenza di zero o più caratteri e la ?
corrispondenza di ogni singolo carattere è ragionevolmente coerente.
Per bash in particolare, questo è documentato nella sezione "Espansione nome file" del manuale bash; eseguire info bash
e cercare "Espansione nome file" o vedere qui .
Il fatto che ciò avvenga con la shell, e non con i singoli comandi, ha alcune conseguenze interessanti (e talvolta sorprendenti). La cosa migliore è che la gestione dei caratteri jolly è coerente per (quasi) tutti i comandi; se la shell non lo avesse fatto, inevitabilmente alcuni comandi non si sarebbero disturbati, e altri lo avrebbero fatto in modi leggermente diversi che l'autore pensava fosse "migliore". (Penso che la shell dei comandi di Windows abbia questo problema, ma non ho abbastanza familiarità con esso per commentare ulteriormente.)
D'altra parte, è difficile scrivere un comando per rinominare più file. Se scrivi:
mv *.log *.log.bak
probabilmente fallirà, poiché *.log.bak
viene espanso in base ai file già esistenti nella directory corrente. Ci sono comandi che fanno questo tipo di cose, ma devono usare la propria sintassi per specificare come i file devono essere rinominati. Alcuni comandi (come find
) possono eseguire la propria espansione con caratteri jolly; devi citare gli argomenti per sopprimere l'espansione della shell:
find . -name '*.txt' -print
L'espansione jolly della shell si basa interamente sulla sintassi dell'argomento della riga di comando e sull'insieme dei file esistenti. Non può essere influenzato dal significato del comando. Ad esempio, se si desidera spostare tutti i .log
file nella directory principale, è possibile digitare:
mv *.log ..
Se dimentichi il ..
:
mv *.log
e ci sono esattamente due .log
file nella directory corrente, si espanderà in:
mv one.log two.log
che rinominerà one.log
e clobber two.log
.
EDIT : E dopo 52 voti, un'accettazione e un badge Guru, forse dovrei effettivamente rispondere alla domanda nel titolo.
L' opzione -d
o non dice di elencare solo le directory. Gli dice di elencare le directory come se stesse, non i loro contenuti. Se si fornisce un nome di directory come argomento , per impostazione predefinita elencherà il contenuto della directory, poiché di solito è quello che ti interessa. L' opzione dice di elencare solo la directory stessa. Ciò può essere particolarmente utile se combinato con caratteri jolly. Se digiti:--directory
ls
ls
-d
ls -l a*
ls
ti darà un lungo elenco di ogni file il cui nome inizia con a
e del contenuto di ogni directory il cui nome inizia con a
. Se desideri solo un elenco di file e directory, una riga per ciascuno, puoi utilizzare:
ls -ld a*
che equivale a:
ls -l -d a*
Ricorda ancora che il ls
comando non vede mai il *
personaggio.
Per quanto riguarda dove questo è documentato, man ls
ti mostrerà la documentazione per il ls
comando su qualsiasi sistema simile a Unix. Sulla maggior parte dei sistemi basati su Linux, il ls
comando fa parte del pacchetto GNU coreutils; se avete la info
di comando, sia info ls
o info coreutils ls
dovrebbe darvi una documentazione più definitivo e completo. Altri sistemi, come MacOS, possono utilizzare versioni diverse del ls
comando e potrebbero non avere il info
comando; per tali sistemi, utilizzare man ls
. E ls --help
mostrerà un messaggio di utilizzo relativamente breve (117 righe sul mio sistema) se stai usando l'implementazione di coreutils GNU.
E sì, anche gli esperti devono consultare la documentazione di tanto in tanto. Vedi anche questa barzelletta classica .