Come ottenere silenziosamente una stringa vuota da un modello glob senza corrispondenze


24

Supponiamo di avere una cartella con tre file:

foo1
foo2
bar

1. Se corro

list_of_files=$(print foo*)
echo $list_of_files

Ottengo: foo1 foo2

2. Se corro

list_of_files=$(print bar*)
echo $list_of_files

Ottengo: bar

3. Tuttavia, se corro

list_of_files=$(print other*)
echo $list_of_files

Ottengo: zsh: no matches found: other*(la variabile $list_of_filesè vuota però)


C'è un modo per chiedere a zsh di non lamentarsi se non può eguagliare un'espansione glob?

Il mio obiettivo è quello di utilizzare il meccanismo sopra per raccogliere silenziosamente un elenco di file che corrispondono a un determinato modello glob.

Risposte:


33

Attiva l' null_globopzione per il tuo modello con il Nqualificatore glob.

list_of_files=(*(N))

Se lo stai facendo su tutti i pattern di uno script o di una funzione, attiva l' null_globopzione:

setopt null_glob

Questa risposta ha equivalenti bash e ksh.

Non utilizzare printo comandare la sostituzione! Ciò genera una stringa composta dai nomi dei file con spazi tra loro, anziché un elenco di stringhe. (Vedi Cos'è la suddivisione delle parole? Perché è importante nella programmazione della shell? )


15

Il modo migliore: for a in *(.N); do ... ; done. L'opzione N fa sì che zsh consegni un elenco vuoto a per, e per ripeterà zero volte.

Attenzione per ls *.foo(.N); quando ls riceve un elenco di argomenti vuoto, elenca tutti i file anziché nessuno. Questo è il motivo per cui non mi piace NULL_GLOB (o il suo equivalente bash): cambia tutti i globs e interrompe facilmente le chiamate, ad esempio ls.


Mi piacerebbe vedere la tua risposta qui @arnt, questo è proprio quello di cui avevo bisogno.
gtd

Perché l' .in in (.N)? Altre risposte hanno di (N)per sé, qual è la differenza?
Michael Dorst,

La domanda riguardava i file e .limita il glob affinché corrisponda solo ai file.
Arnt

4

Penso che tu stia cercando l' NULL_GLOBopzione:

   NULL_GLOB (-G)
          If a pattern for filename generation has no matches, delete  the
          pattern  from  the  argument list instead of reporting an error.
          Overrides NOMATCH.

-1

Prova in questo modo:

list_of_files=$(print other*) 2>/dev/null

Reindirizzerà l'output dell'errore da stderr a / dev / null e non verrà visualizzato.


Questo non funziona affatto.
Pablo Olmos de Aguilera C.
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.