J'ai créé trois fichiers dans mon répertoire à l'aide de la commande touch inv{1..3}.txt
. Maintenant, j'ai utilisé deux commandes et leur sortie est à peu près la même. Ces deux commandes sont ls inv[13].txt
et ls {1,3}.txt
.
Alors, comment sont ces deux différents? En quoi les crochets sont-ils différents des accolades? J'étais aussi en train de googler pour "linux [..]", mais je n'ai rien trouvé, alors est-ce que je peux savoir comment ces choses s'appellent dans la terminologie linux?
Merci
{}
est appelé expansion d'accolade. Il se présente sous deux formes: {x..y}
et {x,y}
, remplacez x
et y
par une valeur alphabétique ou numérique.
Dans le premier formulaire, {x..y}
sera étendu à toutes les valeurs de x
à y
name__, inclus. Par exemple, {2..5}
sera étendu à 2
, 3
, 4
, 5
.
Dans la deuxième forme explicite, {x,y}
sera étendu à x
name__, y
name__. Par exemple, {2,5}
sera étendu à 2
et 5
.
Si aucune expansion n'est possible, le motif est traité littéralement, p. Ex. dans {a..3}
.
La chose importante à noter est que le développement de l'accolade sera effectué (si possible) indépendamment de toute correspondance de fichier, lors de la création/correspondance de fichier.
[]
est connu sous le nom de modèle de développement de chemin d'accès (ou globbing). Contrairement à l'extension d'accolade, vous ne pouvez l'utiliser que pour faire correspondre les noms de fichiers, elle sera traitée littéralement si vous l'utilisez lors de la création de fichiers.
Il se présente sous deux formes: [xyz...]
et [x-y]
.
Dans la première forme, il fera correspondre n'importe quel caractère entre les crochets séparément, par exemple. chaque personnage est traité individuellement. Ainsi, pour [25].txt
, il correspondra à un fichier nommé 2.txt
ou 5.txt
dans le répertoire en cours, tandis que pour [245].txt
il correspondra à tout fichier nommé 2.txt
ou 4.txt
ou 5.txt
.
Dans la seconde forme, une extension de plage est d'abord effectuée avant la mise en correspondance individuelle, si possible traitée littéralement. Donc, pour [2-5]. txt
, cela correspond à tout fichier nommé 2.txt
ou 3.txt
ou 4.txt
ou 5.txt
. Si la plage ne peut pas être étendue, elle sera traitée littéralement, par exemple. dans le cas de [a-3].txt
.
Une différence de comportement importante entre les deux réside dans le fait qu'il y a plus de motifs à apparier que moins de correspond. Comme le développement de l'accolade est fait quoi qu'il en soit, cela montrera l'erreur que certains fichiers n'existent pas alors que l'expansion du nom de chemin correspondra à tout ce qui est possible sans erreur pour le reste:
$ 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
Note de portabilité:
L'opérateur d'expansion du nom de chemin []
est défini par POSIX, ce qui le rend portable entre Bourne Shell et ses dérivés.
L’extension d’accolade, {}
, n’est pas définie par POSIX et n’est donc pas portable entre tous les shells. Par exemple, dash
(sh
dans Ubuntu) ne l’a pas. Il a été emprunté à csh
et ne fonctionnera que sur certains shells, par exemple. bash
name__, zsh
name__, ksh93
, fish
name__. Assurez-vous que le shell que vous utilisez supporte cela avant de l'implémenter.
Exemple:
$ 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
La principale différence entre les deux formes est illustrée ici:
$ 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
est un glob et étendra la liste des fichiers correspondants sur votre système de fichiers. C'est extension du chemin.
inv{1,5}.txt
se développe en inv1.txt
et inv5.txt
quels que soient les fichiers présents dans votre système de fichiers. Ceci est expansion de l'accolade.