La commande suivante va tar
tous 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?
Réponses:
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 labash
[[
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 .
la source
.
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.ls .?
a renvoyé le même quels ..
, 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..
.[^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..[!.]
peut être laissé comme un littéral sur latar
ligne 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 nullglob
le fera disparaître de la ligne de commande s'il ne correspond à rien, mais ce n'est pas une fonctionnalité universelle.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.
la source
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.la source