|
|
Page précédente : CP-13 : Décomposer l'option '-a' - Les options '-p', '-d', '-R', '-P', '-L' et '--preserve=[ATTRIBUT]' L'expansion des noms de fichiers et les fichiers ou répertoires cachésSommaire :
Dans un système Linux, certains noms de fichiers ou de répertoires comportent un point initial : ce sont des fichiers ou des répertoires cachés. Ils sont ainsi nommés parce que, par défaut, ils sont généralement 'invisibles'. La commande 'ls', par exemple, ne les affichera que si elle est lancée avec l'option spécifique '-a'. Un navigateur de fichiers comme Konqueror ne vous les montrera que si, dans le menu 'Affichage', vous avez choisi 'Afficher les fichiers cachés' etc. Ces fichiers ou répertoires sont en général à la racine des répertoires personnels des utilisateurs. Ils contiennent (s'il s'agit de répertoires), ou sont eux-mêmes, des fichiers de configuration, propres à l'utilisateur, destinés à certaines 'applications' (autrement dit à certains logiciels présents sur le système). Ils contiennent parfois aussi certaines données personnelles traitées par l'application pour laquelle ils sont conçus. Le problème : non reconnaissance du point initial par les méta-caractèresVous avez décidé de copier carrément tout le contenu de votre répertoire personnel sur votre nouveau petit disque dur externe, avant de partir en voyage... Bon, voyons - vous dites-vous alors à vous-même - je vais commencer par créer, avec la commande 'mkdir', un dossier 'toto' sur mon disque externe. Puis, je vais copier là-dedans tout ce qui se trouve actuellement, sur le disque dur de mon ordinateur, dans mon dossier personnel /home/toto. Et, pour cela, comme la Base de Connaissances de Mandriva m'a appris à le faire en CP-5, je vais utiliser le méta-caractère étoile (*) et faire usage de l'option 'conservatrice' '-a'. Vous tapez donc, finalement : mkdir /mnt/MON_DISQUE/toto cp -a /home/toto/* /mnt/MON_DISQUE/toto/ Vous prenez le train. Vous arrivez à l'autre bout du pays, et… vous vous mettez en devoir de chercher le mail récent de Dugommier si important… et … impossible de le trouver !! C'est que votre courrielleur Thunderbird entrepose votre courrier dans un dossier caché, .thunderbird, et vous vous apercevez vite que, sur votre joli petit disque dur externe, les fichiers et dossiers cachés sont plus que cachés, ils ne sont tout simplement pas là du tout !! Manifestement, aucun d'entre eux n'a été copié ! A qui la faute ?? Ni votre matériel, ni la commande 'cp' ne sont en cause, mais bien plutôt une particularité de l'expansion des noms de fichiers. Par défaut, le méta-caractère * ne 'reconnaît pas' les noms à point initial. De ce fait, la commande cp -a /home/toto/*..., que vous aviez lancée avant de partir, ne les a pas 'vus' et ne les a donc pas copiés ! Comme nous le verrons dans la suite de cette page cette non reconnaissance du point initial par un méta-caractère de l'expansion des noms de fichiers est tout à fait générale et vaut aussi pour le méta-caractère ? et pour les crochets [...]. Solution 1 : éviter d'employer le méta-caractère 'fautif'Qu'aurait-il fallu faire ? Une solution très simple (et, dactylographiquement parlant, plus économique), pourrait être ceci : en une seule et unique ligne de commande, créer le nouveau répertoire de destination 'toto' et y copier du même coup le contenu de votre répertoire personnel /home/toto (comme vous avez, je présume, appris à le faire en CP-4) : cp -a /home/toto/ /mnt/MON_DISQUE/toto/ Ceci vous évite d'avoir à utiliser l'étoile (*), et de ce fait, tous vos fichiers cachés seront, cette fois, bien copiés. Solution 2 : mentionner explicitement le point initial du nom de fichier/répertoireD'autres moyens encore permettent de se tirer d'affaire. Imaginons que vous vouliez copier tous vos fichiers cachés, et eux seuls (ce pourrait être pour les reproduire dans le répertoire personnel d'un nouveau compte utilisateur que vous êtes en train de créer, afin que ce nouveau compte dispose exactement des mêmes paramétrages que le vôtre - mais attention dans ce cas soyez prudent : certains de ces répertoires peuvent contenir aussi des données personnelles, comme .thunderbird qui contient vos mails - si Thunderbird est votre courielleur - ou comme .unison qui contient des archives de vos sauvegardes antérieures - si Unison est votre logiciel de sauvegarde… un peu de prudence sera donc de mise lors d'une telle manoeuvre...). Dans un tel cas vous pourrez faire : cp -a .* /home/minouche/ Notez qu'ici l'étoile n'a pas à 'reconnaître' le point et fonctionne tout à fait normalement : dans le cadre de l'expansion des noms de fichiers, l'expression '.*' recherche un nom formé d'un point initial (c'est le sens du '.') suivi de n'importe quoi d'autre y compris rien (c'est le sens de '*').
Attention : dans le cadre d'une expression rationnelle (ou régulière) '.*' a un sens différent et signifie 'un nombre quelconque éventuellement nul de caractères'. La présence d'un point initial dans la suite de caractères qui sera reconnue n'est dans ce cas nullement requise. En somme, la suite du point suivi de l'étoile (.*), dans une expression rationnelle, accomplit une tâche très voisine de celle qu'accomplit à lui seul le joker étoile (*) de l'expansion des noms de fichiers.
Et, tant que nous y sommes, histoire de bien voir la différence entre expansion des noms de fichiers et expression rationnelle : une expression rationnelle qui reconnaîtrait une suite de caractères commençant par un point suivi de n'importe quelle suite de caractères ou de rien serait : \..* Solution 3 : activer la reconnaissance par le shell du point initialEnfin, si copier des fichiers cachés est une activité à laquelle vous vous livrez à tour de bras, vous pourrez reconfigurer le shell pour que les jokers reconnaissent le point initial des noms de fichiers ou de répertoires. La commande 'shopt' active ou désactive certaines OPTions du SHell. L'option 'dotglob' autorise la reconnaissance du point par les méta-caractères de l'expansion des noms de fichiers. Pour mieux mémoriser : le nom dotglob est formé de l'anglais dot, qui signifie point, et du début de globbing, qui est le terme anglais pour 'expansion des noms de fichier'. D'autre part, avec l'option '-s' de 'shopt', vous activerez l'option du shell fournie en argument ('-s' : de l'anglais set = activer). Au total, si vous tapez la ligne de commande : shopt -s dotglob l'étoile (*) reconnaîtra désormais les noms commençant par un point. Si vous aviez lancé cette commande avant la deuxième commande de cette page (cp -a /home/toto/* /mnt/MON_DISQUE/toto/), tous vos fichiers cachés auraient été copiés correctement sur votre disque dur externe. Notez que pour travailler à nouveau avec l'option du shell 'dotglob' désactivée, vous pouvez lancer une nouvelle session du shell (il suffit d'ouvrir une nouvelle console ou de lancer la commande 'bash') ou bien vous pouvez faire ceci : shopt -u dotglob Le joker '?'Ce qui a été dit plus haut du joker * vaut du joker ? qui ne reconnaît pas non plus le point initial des noms de fichier ou de répertoire. Ainsi, le répertoire .kde ne sera pas reconnu par la commande suivante (l'exemple est très artificiel, je le reconnais, mais clair...), qui entraînera l'affichage d'un message d'erreur. cp -a ?kde /mnt/MON_DISQUE/toto ls: ?kde: Aucun fichier ou répertoire de ce type Vous trouverez sans peine, si nécessaire, pour des cas d'emploi du joker ? avec des fichiers ou répertoires cachés, des solutions parallèles à celles proposées plus haut pour le joker 'étoile'. Le point initial dans une gamme de caractères entre crochetsNotons pour terminer que l'expansion des noms de fichiers ne reconnaîtra pas non plus le point initial d'un nom de fichier ou de répertoire qui figurerait entre les crochets qui exigent (ou refusent) qu'une certaine position dans le nom de fichier ou de répertoire soit occupée par une certaine gamme de caractères. Ainsi la commande, un peu artificielle, je le confesse : cp -a [._]a config/ cp -a minouche[._]gif portraits/ Et plus généralement...
Tous les exemples qui précèdent concernent la commande 'cp'. Bien entendu, tout ce qui est dit ici s'applique aussi, mutatis mutandis, en cas d'utilisation des nombreuses autres commandes du shell qui acceptent l'expansion des noms de fichier.
Un exemple : l'affichage des fichiers et répertoires cachés situés à la racine d'un répertoireNous donnerons ici un autre exemple d'une technique qui a été suggérée plus haut dans cette page, mais qui concernera, cette fois, non plus la commande 'cp', mais la commande 'ls'.
Pour des informations complémentaires sur la commande 'ls', utilisée dans ce qui suit, voir d'abord ici, puis là.
Pour l'affichage des fichiers non cachés situés à la racine d'un répertoire, voir cette page. Pour l'affichage des fichiers cachés et des fichiers non cachés situés à la racine d'un répertoire voir ici. La ligne de commande suivante affichera la totalité des fichiers et répertoires cachés situés à la racine de votre répertoire de travail (et elle n'affichera aucun fichier ou répertoire non caché) : ls -d .* l'option -d de la commande 'ls' empêche l'affichage du contenu des sous-répertoires, seuls les sous-répertoires cachés eux-mêmes, mais non leur contenu, seront donc affichés. Si vous supprimez l'option -d, tous les fichiers situés à la racine des sous-répertoires cachés seront affichés. Pour le sens de l'expression '.*', voir plus haut. De la même façon, pour afficher la totalité des fichiers et répertoires cachés situés à la racine du répertoire personnel /home/glin/ de l'utilisateur 'glin', tapez (si vous avez les droits nécessaires, donc sans doute sous root si vous n'êtes pas 'glin' vous-même) : ls -d /home/glin/.* Toutes les pages sur la copie - L'expansion des noms de fichiers - Les pages sur le shell - Index de la Base de Connaissances Page suIvante : Copier les points de montage sans leur contenu Auteur : ptyxs (mars 2006) Legal: This page is covered by the GNU Free Documentation License . Standard disclaimers of warranty apply. Copyright LSTB and Mandrakesoft. |
Au lieu des commandes précédentes tapez pour votre répertoire de travail :
Vous voulez voir uniquement les fichiers cachés (et donc pas les répertoires cachés) :
Tapez :
Nota bene Ces commandes supposent toutes les quatre que les noms de répertoire soient suivis d'une barre oblique ('/') dans la sortie de 'ls'. Ceci n'est vrai que si 'ls' est lancée avec l'option '-F'. Dans la distribution Mandriva, un alias, présent dans le fichier de configuration /etc/profile.d/alias.sh, assure la présence 'invisible' de cette option lorsqu'on tape simplement 'ls' au clavier. S'il n'en est pas ainsi dans votre système, rajoutez l'option '-F' aux quatre commandes précédentes.