web-dev-qa-db-fra.com

Quelle est la différence entre ls [13] et ls {1,3}?

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

11
posixKing
  • {} est appelé expansion d'accolade. Il se présente sous deux formes: {x..y} et {x,y}, remplacez xet ypar une valeur alphabétique ou numérique.

    Dans le premier formulaire, {x..y} sera étendu à toutes les valeurs de xà yname__, inclus. Par exemple, {2..5} sera étendu à 2, 3, 4, 5.

    Dans la deuxième forme explicite, {x,y} sera étendu à xname__, yname__. 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(shdans Ubuntu) ne l’a pas. Il a été emprunté à cshet ne fonctionnera que sur certains shells, par exemple. bashname__, zshname__, ksh93, fishname__. 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
14
heemayl

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.

7
John1024