Domanda:
Cerca * .swo
Damien Sawyer
2015-12-03 03:48:31 UTC
view on stackexchange narkive permalink

Penso che dovrebbe essere facile, ma mi ha lasciato perplesso.

Quando utilizzo quanto segue, trova il file.

  $ ls -al .bash _ *. sw * -rw-r - r-- 1 damiensawyer staff 12288 27 novembre 07:39 .bash_profile.swo  

Ma quando lo uso, non lo trova.

  $ ls -al *. sw * ls: * .sw *: nessun file o directory  

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

Quattro risposte:
joeytwiddle
2015-12-03 09:03:37 UTC
view on stackexchange narkive permalink

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

La decisione su come espandere i pattern glob (pattern contenenti * e ? ) è creato dalla shell . La tua shell è molto probabilmente bash.

Per impostazione predefinita, bash non esegue l ' espansione del percorso sui dotfile. Tuttavia, può farlo scrivendo esplicitamente . (come hai già scoperto) o attivando l'opzione dotglob . Dalla manpage bash:

dotglob Se impostato, bash include i nomi dei file che iniziano con "." nei risultati dell'espansione del nome del percorso.

Per dimostrare, stampiamo semplicemente l'espansione con echo invece di ls :

  $ touch .bash_profile.swo $ echo. *. swo.bash_profile.swo $ echo * .swo * .swo $ shopt -s dotglob $ echo * .swo.bash_profile.swo  

Ulteriori discussioni possono essere trovate qui.

Zach Gates
2015-12-03 03:54:08 UTC
view on stackexchange narkive permalink

Uso di ls

Il problema è che il tuo file ha due punti, non uno. Devi tenerne conto:

  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 anche .swz corrisponderà.


Utilizzando find

Puoi utilizzare quanto segue per trovare tutti i file con la stessa estensione ( swo nel caso sotto) 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 ~ come percorso verrà eseguita la ricerca in tutta la directory home.

Grazie Zach.Sono consapevole dell'utilizzo di find.Mi chiedo se c'è una ragione per cui ls non funziona.È una limitazione di ls?
Ho modificato la mia risposta.@DamienSawyer
aah cool.Quindi, il risultato dovrebbe essere "la stella non corrisponde al periodo"?
* Non * corrisponde a un punto, ma presuppone che tutto ciò che è dopo il primo punto sia la parte che deve corrispondere a "sw *".@DamienSawyer
In realtà, non sono i "due punti" il problema, è il fatto che il primo punto è il primo carattere.In Unix questa è la convenzione per nascondere i file.* .sw * corrisponderebbe a red.and.joe.are.sworn.enemies, poiché questo non è un file "nascosto".
mmmmmm
2015-12-03 04:19:51 UTC
view on stackexchange narkive permalink

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

Quindi funzionerà quanto segue:

  ls. * swo  

Le shell Unix espandono il glob prima di ls vede i nomi dei file.

Grazie Marco.In realtà ho provato -a, tuttavia non sembra che il tuo primo campione funzioni.Penso che tu abbia bisogno del periodo principale.
Ehi, intendevi "primo" invece di "peggio"?
Wolfgang
2015-12-03 08:50:28 UTC
view on stackexchange narkive permalink

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

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

La corrispondenza globale viene effettivamente eseguita dalla shell ( bash per impostazione predefinita), non da singoli comandi come ls . Come spiega il manuale di bash in Espansione nome file:

Dopo la divisione delle parole ... Bash esegue la scansione di ogni parola alla ricerca dei caratteri " * ", "? " e " [" . Se viene visualizzato uno di questi caratteri, la parola viene considerata come un modello e sostituita con un elenco in ordine alfabetico di nomi di file che corrispondono al modello (vedere Corrispondenza dei modelli). Se non vengono trovati nomi di file corrispondenti, ... la parola rimane invariata.

Quando viene utilizzato un modello per l'espansione del nome di file, il carattere ". " all'inizio di un nome di file o immediatamente dopo una barra deve essere abbinato esplicitamente, a meno che non sia impostata l'opzione di shell dotglob .



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...