Cerca * .swo

6

Penso che questo dovrebbe essere facile, ma mi ha convinto.

Quando utilizzo quanto segue, trova il file.

$ ls -al  .bash_*.sw*   
-rw-r--r--  1 damiensawyer  staff  12288 27 Nov 07:39 .bash_profile.swo

Ma quando lo uso, non lo trova.

$ ls -al *.sw*      
ls: *.sw*: No such file or directory

Mi aspettavo che il secondo comando restituisse anche .bash_profile.swo . Cosa mi manca?

    
posta Damien Sawyer 02.12.2015 - 22:48
fonte

4 risposte

5

Uso di ls

Il problema è che il tuo file ha due punti, non uno. Devi tener conto di ciò:

ls -al .*.sw*

Questo corrisponderà a qualsiasi file che inizia con un punto (file invisibili come .DS_Store ) e termina anche con .sw* .

.swa e .swz corrisponderanno.

Uso di find

Puoi utilizzare quanto segue per trovare tutti i file con la stessa estensione ( swo nel caso di seguito) in una directory.

find ~ -iname *swo

-iname trova una corrispondenza senza distinzione tra maiuscole e minuscole.

Puoi cercare quel / quei file specifici usando questo:

find .bash_*.sw*

Nota: utilizzando ~ mentre il percorso cercherà l'intera home directory.

    
risposta data 02.12.2015 - 22:54
fonte
6

Questo non è effettivamente causato da ls , poiché ls non espande mai i pattern.

La decisione su come espandere i modelli glob (modelli contenenti * e ? ) è creata dalla shell . Molto probabilmente la tua shell bash .

Di default bash non esegue espansione del percorso su dotfiles. Tuttavia, può farlo scrivendo esplicitamente . (come hai già scoperto) o attivando l'opzione dotglob . Dalla manpage di bash:

dotglob If set, bash includes filenames beginning with a '.' in the results of pathname expansion.

Per dimostrare, stampiamo l'espansione con echo anziché ls :

$ touch .bash_profile.swo

$ echo .*.swo
.bash_profile.swo

$ echo *.swo
*.swo

$ shopt -s dotglob

$ echo *.swo
.bash_profile.swo

Una nuova discussione può essere trovata qui .

    
risposta data 03.12.2015 - 04:03
fonte
3

Il problema è che ls mostra solo i file che iniziano con . devi avere il primo . nel file glob.

Quindi funzionerà:

ls .*swo

Le shell Unix espandono il glob prima che ls veda i nomi dei file.

    
risposta data 02.12.2015 - 23:19
fonte
2

Questi pattern ( *.sw* e simili) sono noti come globs .

Come notato da @Mark e @Zach Gates, i glob non corrispondono ai file il cui nome inizia con un punto a meno che non includi esplicitamente un . all'inizio del pattern. Questo perché in sistemi simili a UNIX (come OS X), i file che iniziano con un punto sono considerati file "nascosti" e generalmente non sono mostrati per impostazione predefinita.

La corrispondenza globale viene effettivamente eseguita dalla tua shell ( bash per impostazione predefinita), non da singoli comandi come ls . Come spiegato nel manuale di bash sotto Espansione del nome del file :

After word splitting... Bash scans each word for the characters ‘*’, ‘?’, and ‘[’. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of filenames matching the pattern (see Pattern Matching). If no matching filenames are found,...the word is left unchanged.

When a pattern is used for filename expansion, the character ‘.’ at the start of a filename or immediately following a slash must be matched explicitly, unless the shell option dotglob is set.

    
risposta data 03.12.2015 - 03:50
fonte

Leggi altre domande sui tag