Comment s'appelle le symbole *. *?

Réponses:

20

Interprétation des *.*anciens systèmes Windows / DOS

La signification ici est plus liée à Windows / DOS qu'à Unix / Linux. Sur les anciens systèmes Windows / DOS, c'était un modèle «générique». Des motifs génériques ont été utilisés pour faire correspondre les noms de fichiers d'une manière similaire aux globes Unix. Le *.*caractère générique était couramment utilisé pour faire correspondre n'importe quel fichier.

Comme avec un glob Unix, le *correspondra à n'importe quelle séquence de caractères dans un nom de fichier, car tel *quel correspondra également à n'importe quel fichier. Cependant, la raison pour laquelle *.*correspondra également un nom de fichier est due à des différences dans la façon dont ces caractères génériques fonctionnent. Selon cet article :

Tout caractère autre qu'un point qui vient après un astérisque n'a aucun effet, car l'astérisque déplace le curseur à la position 12, point auquel rien ne change l'état d'analyse à l'exception d'un point, qui efface les trois dernières positions et déplace le curseur.

Ce comportement (quelque peu étrange du point de vue Unix) signifie qu'un point suivant un *ne correspond pas réellement à un point, mais est juste un moyen hackish pour vous permettre d'ajouter plus de caractères au motif. Cela signifie que l'ajout d'un autre *correspondra à n'importe quoi dans ces trois dernières positions.

Cela a un peu plus de sens lorsque vous considérez que la syntaxe a été utilisée sur DOS et les anciens systèmes Windows avant Windows 95 qui nécessitait des noms de fichiers 8.3 . Ces noms de fichiers n'étaient autorisés qu'à avoir un point et au plus trois caractères après le point. La plupart, sinon tous les fichiers du système, auraient une extension à trois caractères (même si techniquement une extension plus courte ou aucune extension était autorisée), donc je suppose qu'il était logique d'utiliser *.*pour correspondre à n'importe quel fichier (au moins dans une perspective logique Windowsey déformée ).

Interprétation des *.*shells sous Unix

Dans les shells Unix, comme d'autres l'ont souligné, cela représente une «extension de nom de chemin» ou «glob». Le *n'a pas de sauts bizarres vers le comportement de fin et ne conduit donc pas à ce que les personnages qui le suivent soient ignorés. *.*le modèle correspondra à tout nom de fichier contenant un point (sauf au début). Cela ne correspondra certainement à aucun fichier car il existe de nombreux fichiers sur un système Unix / Linux qui n'ont pas d'extension (ou qui contiennent autrement un point car cela est également autorisé).

La raison de *.*ne pas faire correspondre un point au début des noms de fichiers sous Unix est que le fait de placer un point au début est la façon dont les fichiers sont «cachés» et les fichiers cachés sont exclus des globes par défaut. Pour les faire correspondre dans un shell POSIX, un point doit être placé explicitement au début du modèle. Dans bashle dotglobshell, l'option peut être définie ou la GLOBIGNOREvariable peut être définie de manière appropriée, mais c'est une autre question!

Graeme
la source
1
Il convient de noter que les versions actuelles de Windows semblent se comporter de manière plus logique. En particulier, "Tout caractère autre qu'un point qui vient après un astérisque n'a aucun effet" n'est plus vrai; au moins lors du filtrage des fichiers dans une boîte de dialogue Ouvrir un fichier standard sur Windows 7 par le motif *7.*, obtenez tous les fichiers dont le dernier caractère avant l'extension est un 7, et avec *sa*, j'obtiens tous les fichiers qui contiennent la sous-chaîne san'importe où dans le nom de fichier, etc. ( En conséquence, l'article que vous citez est intitulé Comment fait wildcards travailler dans MS-DOS ? (Souligné par moi - même).)
OU Mapper
1
@ORMapper, a mis à jour les en-têtes pour refléter cela. Ce comportement est antérieur à Windows 95, ce qui est dans la réponse (bien que l'en-tête soit trompeur).
Graeme
11

C'est globen bash, ci-dessous j'ai cité du manuel bash:

bash - GNU Bourne-Again SHell

*

Correspond à n'importe quelle chaîne, y compris la chaîne nulle. Lorsque l'option shell globstar est activée et *utilisée dans un contexte d'expansion de nom de chemin, deux adjacents *sutilisés comme modèle unique correspondront à tous les fichiers et à zéro ou plusieurs répertoires et sous-répertoires. S'ils sont suivis d'un /, deux adjacents *sne correspondront qu'aux répertoires et sous-répertoires.

Dans ce cas, *.*faites correspondre tous les fichiers contenant un point .dans son nom.

Vous pouvez voir plus de détails ici .

cuonglm
la source
8

L'astérisque *est un globlangage shell. Citant du langage de commande Shell :

L'astérisque ( '*') est un modèle qui doit correspondre à n'importe quelle chaîne, y compris la chaîne nulle.

Cependant, il ne correspond pas aux noms de fichiers commençant par un .sauf si l'option shell dotglobest définie.

Lorsque vous utilisez *.*, cela correspond à tout ce qui:

  • ne commence pas par un .
  • contient au moins un .

Vous pouvez également vous référer à Extension de nom de fichier dans le manuel.

devnull
la source
6

Beaucoup de gens qui viennent de Windows pensent que *.*c'est pour tous les fichiers. Sous Windows, c'est le cas. Sous UNIX, ce sont tous les fichiers qui contiennent au moins 1 point dans leur nom. *en lui-même fonctionne très bien sous Windows (remontant au début du DOS); cependant les vieux manuels ont été publiés *.*et cela semble être une habitude difficile à briser.

Joshua
la source
4

*est un caractère générique utilisé par le shell pour effectuer une expansion de nom de fichier , également appelé "globbing". *se développe à tout, y compris à rien (par exemple, *.*correspondra file., etc.). L'autre caractère générique courant est celui ?qui correspond à n'importe quel caractère.

Ne confondez pas la fonction de ces caractères génériques avec l'utilisation des mêmes caractères dans les expressions régulières (telles que celles utilisées avec grep).

boucle d'or
la source
3

C'est star-dot-star - au moins, dans le monde DOS (et plus tard, bien sûr, Windows). Sous DOS, le point .a une signification magique particulière, car les noms de fichiers sont une base de huit caractères (étendue plus tard, mais restons à l'ancienne) et une extension à trois caractères (qui définit le type de fichier). Sous Unix, le type de fichier est généralement défini par les deux premiers octets du fichier (ou autre magie), et l'extension est informative mais n'a pas beaucoup de sens. Sauf quand tout est devenu flou.

Donc, sous Unix, il n'y a pas de signification particulière. L'astérisque est un caractère "globbing" dans les shells Unix et est un caractère générique pour n'importe quel nombre de caractères (y compris zéro). ?est un autre caractère de globbing commun, correspondant exactement à n'importe quel caractère.

*.*correspond à tous les noms de fichiers qui en contiennent au moins un .. Il n'a pas de nom spécial ou de signification plus que *a*ou *_*. Et *.?correspondrait à tous les fichiers avec un point et exactement un caractère après ce point. Il existe également des modèles de globalisation étendue plus compliqués - consultez la page de manuel de votre shell.

Le "New Hacker's Dictionary" (une extension de l'ancien "Jargon File" du MIT) note que "star" est le nom le plus courant pour le *symbole (suivi de splat), et je pense que c'est toujours vrai dans la pratique, et .c'est certainement commun " dot ", donc, même si elle n'a pas de signification intrinsèque particulière en tant que symbole aggloméré, la séquence est encore raisonnablement appelée étoile-point-étoile sur Unix. (C'est juste moins utile.)

mattdm
la source
Cela peut sembler étrange mais merci d'avoir mentionné "star dot star", c'est ce qui a rendu cette page googleable!
Score_Under
3

Ici, il y a en fait 2 symboles, un astérisque *et un point .. Les obus n'interprètent normalement que l'astérisque comme n'importe quel caractère, mais en regex, cela signifierait un glob gourmand. Dans ce cas, il correspondrait à tout ce qui ne se termine pas ou ne commence pas par un point, mais en contient au moins un:

somefile.dot # match
.dot.between.words. # match
.onlydotatstart # don't match
onlydotatend. # match
.startandenddot. # don't match
Braiam
la source
1
Votre onlydotatend.cas est un match, sûrement?
Graeme
@Graeme nope. touch 'onlydotatend.' && echo *.*ne le retourne pas
Braiam
1
C'est pour moi! Sur les deux bashet dash. Quel shell utilisez-vous?
Graeme
@Graeme zsh, et vous avez raison, bash ne le fait pas.
Braiam
Je viens de l'essayer sur une zshconfiguration vanille et cela fonctionne aussi là-bas. Je ne comprends pas comment onlydotatend.ne peut pas être une correspondance, existe-t-il une option de configuration qui fait cela?
Graeme