La sintassi a*e *a*viene implementata dalla shell, non dal lscomando.
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 a3e passare quelli come argomenti a ls. Il lscomando stesso non vede mai il *personaggio; si vede solo i tre argomenti a1, a2e a3.
Ai fini dell'espansione dei caratteri jolly, "file" si riferisce a tutte le entità nella directory corrente. Ad esempio, a1potrebbe essere un file normale, a2potrebbe essere una directory e a3potrebbe 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 bashe 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.bakviene 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 .logfile nella directory principale, è possibile digitare:
mv *.log ..
Se dimentichi il ..:
mv *.log
e ci sono esattamente due .logfile nella directory corrente, si espanderà in:
mv one.log two.log
che rinominerà one.loge clobber two.log.
EDIT : E dopo 52 voti, un'accettazione e un badge Guru, forse dovrei effettivamente rispondere alla domanda nel titolo.
L' opzione -do 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:--directorylsls-d
ls -l a*
lsti darà un lungo elenco di ogni file il cui nome inizia con ae 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 lscomando non vede mai il *personaggio.
Per quanto riguarda dove questo è documentato, man lsti mostrerà la documentazione per il lscomando su qualsiasi sistema simile a Unix. Sulla maggior parte dei sistemi basati su Linux, il lscomando fa parte del pacchetto GNU coreutils; se avete la infodi comando, sia info lso info coreutils lsdovrebbe darvi una documentazione più definitivo e completo. Altri sistemi, come MacOS, possono utilizzare versioni diverse del lscomando e potrebbero non avere il infocomando; per tali sistemi, utilizzare man ls. E ls --helpmostrerà 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 .