Que signifie. ?? * dans une commande shell?

22

La commande suivante va tartous les fichiers et dossiers "dot":

tar -zcvf dotfiles.tar.gz .??*

Je connais les expressions régulières , mais je ne comprends pas comment interpréter .??*. J'ai exécuté ls .??*et tree .??*j'ai regardé les fichiers qui étaient répertoriés. Pourquoi cette expression régulière inclut-elle tous les fichiers dans des dossiers commençant par .par exemple?

SabreWolfy
la source

Réponses:

32

Les globes ne sont pas des expressions régulières. En général, le shell essaiera d'interpréter tout ce que vous tapez sur la ligne de commande que vous ne citez pas comme un glob. Les shells ne sont pas du tout tenus de prendre en charge les expressions régulières (bien qu'en réalité, la plupart des plus sophistiqués le font, par exemple l' =~opérateur de correspondance d' expression régulière dans la bash [[construction).

C'est .??*un glob. Il correspond à tout nom de fichier commençant par un point littéral ., suivi de deux caractères (pas nécessairement identiques) ??, suivis de l'équivalent d'expression régulière de [^/]*, c'est-à-dire 0 ou plusieurs caractères qui ne le sont pas /.

Pour plus de détails sur l'expansion du nom de chemin du shell (le nom complet pour "globbing"), voir la spécification POSIX .

jw013
la source
10
Point supplémentaire: il s'agit d'une tentative d'écriture d'un glob qui correspond à tous les fichiers dot dans un répertoire à l' exception des entrées spéciales .et avec ..lesquels on ne veut normalement rien faire. Ce n'est pas tout à fait vrai; il ne ramasse rien nommé ' .X' où X est un caractère autre que point. Je ne pense pas qu'il soit possible d'écrire un seul glob qui corresponde à tous les fichiers dot sauf .et .., mais vous pouvez le faire avec deux: tar zcvf dotfiles.tar.gz .[!.] .??*par exemple.
zwol
@Zack: Merci pour la clarification. J'ai posté un commentaire à ce sujet, mais je l'ai ensuite supprimé. ls .?a renvoyé le même que ls .., ce qui signifie qu'il n'y avait aucune autre entrée dans le dossier correspondant au modèle .?. J'aurais fait .[^.]pour tous les .?fichiers autres que ...
SabreWolfy
2
@SabreWolfy Si vous lisez attentivement la spécification POSIX, c'est en fait une différence importante entre globs et regex: dans les expressions entre crochets, [^abc]dans la syntaxe regex signifie la même chose que [!abc]dans la syntaxe glob (c'est ^-à- dire est remplacée par !pour globs). L'utilisation de la [^abc]syntaxe de style dans un glob n'est pas très portable car POSIX ne spécifie pas ce que cela signifie, donc certains shells l'interprètent en utilisant une sémantique de type regex tandis que d'autres le traitent ^comme un simple caractère littéral.
jw013
1
@ jw013: Merci pour les détails. Je dois me rappeler que glob! =
Regexp
1
Il m'est venu à l'esprit que .[!.]peut être laissé comme un littéral sur la tarligne de commande dans le cas commun où il n'y a pas de fichiers qui correspondent à ce modèle. Certains shells vous permettent de contrôler ce comportement, par exemple avec bash, shopt -s nullgloble fera disparaître de la ligne de commande s'il ne correspond à rien, mais ce n'est pas une fonctionnalité universelle.
zwol
8

Le .??*caractère générique ( pas une expression régulière, bien qu'il ressemble à cela) se traduit par des noms de fichiers qui commencent par un point ( .), suivi de deux caractères simples ( ??), puis d'un nombre (zéro ou plus) d'autres caractères ( *).

Peut-être que cette page sur les caractères génériques dans les noms de fichiers sera utile.

Levon
la source
-1

Pour ajouter aux autres réponses, un seul ?se traduira par un nom de fichier à un seul caractère et ??correspondra aux noms de fichiers qui n'ont que deux caractères et ainsi de suite.

[root@mercy testdir_2]# ls
ion  it  r
[root@mercy  testdir_2]# ls ?
r
[root@mercy  testdir_2]# ls ??
it
[root@mercy 1 testdir_2]# ls ???
ion
[root@mercy  testdir_2]#
Sree
la source
Downvoter, pourriez-vous commenter s'il vous plaît? Serait heureux d'être corrigé, si je me trompe.
Sree
Votre réponse n'a pas répondu complètement à la question.
SabreWolfy