uso di * nella ricerca di file


9

durante la lettura della ricerca di file Linux ho ottenuto il seguente ...

Per cercare file utilizzando il carattere jolly *, sostituire la stringa sconosciuta con *, ad esempio se si ricorda solo che l'estensione era .out, digitare ls * .out

e quando ho provato il seguente comando sul sistema (Ubuntu 14.04 LTS) .. Ho ottenuto

anupam@JAZZ:~$ ls  *.bash* 

ls: cannot access  *.bash* : No such file or directory

anupam@JAZZ:~$ ls  .bash*

.bash_history   .bash_logout  .bash_profile  .bashrc

anupam@JAZZ:~$

nel primo caso perché non mostra tale directory ( *.bash*) e nel prossimo caso mostra i file ( .bash*)

Sono nuovo di questo sapore, e secondo la mia teoria degli automi, le classi (*) indicano qualsiasi combinazione di stringhe incluso epsilon (vuoto) ,, Quindi perché i risultati sono diversi in entrambi i casi ....?

Risposte:


11

Quando si esegue ls *l' *è in fase di espansione , prima si passa alla ls. Vale a dire se abbiamo tre file ( a, be c) in una directory ls *è effettivamente in esecuzione ls a b c.

Quando Bash non può espandersi, passa attraverso la stringa non elaborata¹. Ecco perché visualizzi i caratteri jolly nell'errore, insieme a un messaggio non trovato. lsho provato a mostrare l'elenco per un file chiamato letteralmente *.bash*.

Quindi perché non si è espanso? Bene, per impostazione predefinita il globbing (come si chiama questa espansione jolly) non restituirà i file nascosti. Puoi cambiarlo con shopt -s dotglob(che non persisterà a meno che tu non lo inserisca nel tuo .bashrc- potrebbe essere disabilitato di default per una buona ragione, quindi fai attenzione), ecco una breve demo:

$ ls  *.bash*
ls: cannot access *.bash*: No such file or directory
$ shopt -s dotglob
$ ls  *.bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

L'eccezione a questo è - come hai già mostrato - quando hai già dichiarato esplicitamente che i file saranno nascosti con uno schema simile .bash*. Sostituisce semplicemente l' dotglobimpostazione predefinita :

$ shopt -u dotglob  # unset dotglob
$ ls .bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

Ad ogni modo, oltre a quella stranezza, spero che questo ti aiuti a capire cosa succede sotto la superficie.


Ci sono altre shoptbandiere che alterano come globbing opere: extglob, failglob, globstar, nocaseglobe nullglob. Loro e una serie di altre shoptbandiere sono documentate come parte del manuale di Bash .

Allo stesso modo, la pagina su Pattern Matching dovrebbe essere di buona lettura.

¹ A meno failglobche non nullglobsiano impostati.


grazie @Oli ,, Non ho capito tutto come ho detto che sono nuovo di questo sapore ,, ma ho ottenuto l'80% di quello ... Mi ha aiutato
lazarus,
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.