2009-04-30 5 views

Répondre

8

Ce n'est pas un bogue, et ça marche bien dans les mots. Le problème que vous avez ici est que {1..9} n'est pas une expression générique comme * est; Comme le montre votre exemple d'écho, c'est une expansion itérative. Donc, votre exemple zgrep est exactement le même que si vous aviez tapé chaque version alternative dans la ligne de commande, et puis, comme il n'y a pas de pages man commençant par zsh dans man2, il y a des erreurs. (Il est la moindre erreur sur un échec à trouver une correspondance, rien intrinsèquement lié à l'expansion de votre séquence accolade.)

Si vous avez fait cela, d'autre part:

zgrep -c compinit /usr/share/man/man[1-9]/zsh* 

vous obtiendrez les résultats vous vous attendez, car [1-9] est une expression générique normale.

+0

nous avons donc deux espaces: l'un est non générique et l'autre est un espace générique. S'il existe un caractère générique, cela me force à n'utiliser que des caractères génériques. De la même manière, vous ne pouvez utiliser que des caractères non génériques. - - Merci pour votre réponse! –

+2

@Masi: Pas tout à fait. Si j'avais un répertoire avec 1-hello.gif, 2-world.gif, ..., 20-foobar.gif, '{1..20} - *. Gif' fonctionnerait parfaitement bien pour les faire correspondre, alors que' [1-20] - *. Gif' ne correspond qu'aux deux premiers. Cela provoquera la même erreur que dans votre question si l'un des fichiers numérotés séquentiellement est manquant, cependant. – ephemient

+0

@ ephemient: Voulez-vous dire que le fichier [1-20] ne fonctionne pas si vous n'avez pas, par exemple, 7File? - Si oui, quel est l'avantage d'utiliser [1-20] au lieu de {1..20} ce qui ne vous cause pas le problème? –

6

Dans zsh, si vous souhaitez utiliser des plages dans les noms de fichiers, zle propose <1-n> sur tous les noms réels sur lesquels il peut développer. C'est-à-dire:

$ touch a0b a1b a5b a7b 
$ print a<0-100>b 

Et puis frappé <Tab> juste après la finale b vous laisserions print a0b a1b a5b a7b élargi sur la ligne.

Pour toutes les autres fins - peut-être les exigences de gamme complète, non-fichier et l'utilisation de scripts - j'exprimer cela en utilisant la boucle de zsh idiomatiques plutôt succincts que:

for n ({1..50}); do print $n; done 

Est-ce que vous permettra de traiter l'ensemble plage de la séquence des nombres 1 à 50 :) après quoi vous pouvez faire toutes sortes de choses utiles avec, comme une collection de fichiers qui n'existe pas encore:

arr=($(for n ({1..50}); do print /my/path/file$n.txt; done)) && print $arr[33] 
Questions connexes