Qual è la differenza tra ls [13] e ls {1,3}?


11

Ho creato tre file nella mia directory usando il comando touch inv{1..3}.txt. Ora ho usato due comandi e il loro output è praticamente lo stesso. Questi due comandi sono ls inv[13].txte ls {1,3}.txt.

Quindi, come sono questi due diversi? In che modo le parentesi quadre sono diverse rispetto alle parentesi graffe? Inoltre cercavo su "linux [..]", ma non riuscivo a trovare nulla, quindi potevo sapere come si chiamano queste cose nella terminologia di linux?

Grazie


2
Il nome per questo è "espansione del nome file" o "globbing".
Byte Commander

Quale di questi è l'espansione del file o il globbing? È la parentesi quadra ([..]) o la parentesi fiore ({..})?
posixKing

Risposte:


14
  • {}si chiama espansione parentesi graffa. Ha due forme: {x..y}e {x,y}, sostituire xe ycon qualsiasi valore alfabetico o numerico.

    Nella prima forma, {x..y}verrà espanso a tutti i valori da xa y, incluso. Ad esempio, {2..5}sarà ampliato a 2, 3, 4, 5.

    Nella seconda forma esplicita, {x,y}sarà ampliato a solo x, y. Ad esempio, {2,5}verrà espanso in 2e 5.

    Se non è possibile alcuna espansione, il modello viene trattato letteralmente ad es {a..3}.

    La cosa importante da notare è che l'espansione del controvento verrà eseguita (se possibile) indipendentemente da qualsiasi corrispondenza dei file, durante la creazione / corrispondenza dei file.

  • []è noto come modello di espansione del percorso (o globbing). A differenza dell'espansione parentesi graffa, è possibile utilizzarla solo durante la corrispondenza dei nomi dei file, verrà trattata letteralmente se la si utilizza durante la creazione di file.

    Ha due forme: [xyz...]e [x-y].

    Nella prima forma, corrisponderà a ogni singolo carattere all'interno delle parentesi quadre separatamente, cioè ogni carattere viene trattato singolarmente. Quindi per [25].txtesso corrisponderà a un file denominato 2.txto 5.txtnella directory corrente, mentre per [245].txtesso corrisponderà a qualsiasi file denominato 2.txto 4.txto 5.txt.

    Nella seconda forma, l'espansione della gamma viene eseguita prima di corrispondere individualmente, se possibile altrimenti trattata letteralmente. Quindi [2-5]. txt, corrisponderà a qualsiasi file denominato 2.txto 3.txto 4.txto 5.txt. Se l'intervallo non può essere ampliato, verrà trattato letteralmente, ad esempio in caso di [a-3].txt.


Un'importante differenza comportamentale tra questi due è quando ci sono più schemi da abbinare mentre meno è effettivamente abbinato. Man mano che l'espansione del controvento viene eseguita, qualunque cosa accada, mostrerà l'errore che alcuni file non esistono mentre l'espansione del percorso corrisponderà per quanto possibile senza alcun errore per il resto:

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

Nota sulla portabilità:

L' []operatore di espansione del nome di percorso è definito da POSIX, quindi portatile tra shell Bourne e derivati.

L'espansione del controvento, {}non è definita da POSIX quindi non è portatile tra tutte le shell. Ad esempio, dash( shin Ubuntu) non ha questo. E 'stato preso in prestito da cshe lavorerà su alcuni gusci solo ad esempio bash, zsh, ksh93, fish. Assicurarsi che la shell che si sta utilizzando supporti questo prima dell'implementazione.


Esempio:

$ touch {1..3}.txt

$ ls {1..3}.txt
1.txt  2.txt  3.txt

$ ls {1,2,3}.txt
1.txt  2.txt  3.txt

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls {a..3}.txt
ls: cannot access {a..3}.txt: No such file or directory

$ ls [123].txt
1.txt  2.txt  3.txt

$ ls [1-3].txt
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

$ ls [a-3].txt
ls: cannot access [a-3].txt: No such file or directory

1
Si dovrebbe evitare di fare affidamento sul comportamento [ ]dell'espansione quando non ci sono corrispondenze perché ciò può variare a seconda della configurazione della shell. Se si desidera utilizzare [o ]in un nome file, deve essere citato nei comandi. Vale anche la pena notare la differenza tra {13..79}e [13-79]. Il primo produrrà tutti i numeri nell'intervallo da 13a 79, la seconda sarà corrispondere ai caratteri 1, 3, 4, 5, 6, 7, e 9.
Kasperd,

@kasperd Sì, questo è nullglob(o simile). Per quanto riguarda la [13-79]corrispondenza, penso di aver menzionato chiaramente nella mia risposta il comportamento per carattere di [] `.
heemayl,

@heemayl Penso che varrebbe anche la pena ricordare che la forma `{1..3}` è bashismo. Questo non funzionerà in linea. Penso che kshabbia questa caratteristica, ma non i sapori più moderni, come mksh e pkdsh
Sergiy Kolodyazhnyy,

@Serg Aggiunta la nota di portabilità.
heemayl,

7

La differenza chiave tra le due forme è illustrata qui:

$ ls inv[15].txt
inv1.txt
$ ls inv{1,5}.txt
ls: cannot access 'inv5.txt': No such file or directory
inv1.txt

inv[15].txtè un glob ed espande un elenco di file corrispondenti sul tuo file system. Questa è l' espansione del nome percorso .

inv{1,5}.txtsi espande inv1.txte inv5.txtindipendentemente da quali file siano effettivamente presenti nel tuo file system. Questa è l' espansione del tutore .


L'altra differenza fondamentale è che puoi scrivere ba{con,tman}e non c'è equivalente usando le parentesi quadre. IOW, l'espansione del controvento non è solo per singoli personaggi.
Hobbs,
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.