Fichiers et répertoires cachés
Un article de Wiki de la communauté Mandriva.
CETTE PAGE EST UNE VERSION RÉVISÉE DE LA PAGE MAINTENANT OBSOLÈTE DE L'ANCIENNE BASE DE CONNAISSANCES :
http://club.mandriva.com/xwiki/bin/view/KB/Dotglob ptyxs 9 mars 2008 à 13:27 (CET)'
[modifier] Qu'est-ce qu'un fichier ou répertoire caché ?
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.
Ces fichiers ou répertoires sont en général situés à la racine du répertoire personnel de l'utilisateur.
Ils contiennent (s'il s'agit de répertoires), ou sont eux-mêmes, des fichiers de configuration, spécifiques à l'utilisateur, destinés à personnaliser certaines applications. Ils contiennent parfois aussi des données personnelles de l'utilisateur traitées par une certaine application.
Ils sont ainsi nommés parce que, par défaut, ils sont généralement « invisibles ».
Ainsi, un navigateur de fichiers comme Konqueror ne vous montrera les fichiers et répertoires cachés que si, dans le menu Affichage, vous avez choisi Afficher les fichiers cachés. Une fois ce choix fait, ils seront facilement visibles, regroupés en tête de liste si vous avez choisi un ordre d'affichage alphabétique.
En console, les commandes suivantes ne les afficheront pas :
Ils deviendront visibles si vous ajoutez à ces commandes l'option spécifique -a. Un alias Mandriva permet d'utiliser alors la au lieu de ls -a. Pour inclure les fichiers et répertoires cachés dans la sortie de ls, faites donc :
ou :
Pour plus de détails sur l'affichage des fichiers et répertoires cachés, consultez la section suivante.
Les passionnés de la ligne de commande et les adeptes des scripts shells auront intérêt à savoir que les fichiers et répertoires cachés sont même, dans certains cas, complètement invisibles pour le joker *, le joker ? et les gammes de caractères entre crochets ([...]) de l'expansion des noms de fichiers. Voir là-dessus la section #L'expansion des noms de fichiers et les fichiers ou répertoires cachés.
[modifier] L'affichage des fichiers et répertoires cachés situés à la racine d'un répertoire
Pour plus de détails sur la commande ls utilisée ci-dessous, consulter si nécessaire la page La commande ls.
[modifier] Vous voulez voir ce qui est caché et ce qui ne l'est pas
Dans le navigateur de fichiers Konqueror, faites F9 > Affichage > Afficher les fichiers cachés. Sélectionnez un répertoire dans la partie gauche de la fenêtre : les fichiers et répertoires cachés et non cachés à la racine du répertoire sélectionné s'affichent dans la partie droite.
En console, l'option -a fait apparaître les éléments cachés, une commande standard serait :
grâce à un alias de Mandriva, tapez plus simplement :
Pour voir aussi les propriétés, une commande standard serait :
toujours grâce à l'alias de Mandriva, tapez plutôt :
[modifier] Vous voulez voir uniquement les fichiers et les répertoires cachés
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é) :
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. Pour le sens de l'expression .*, voir plus bas.
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) :
[modifier] Vous voulez voir uniquement les répertoires cachés (et donc pas les fichiers cachés)
Utilisez une barre oblique finale.
Au lieu des commandes précédentes tapez :
- pour votre répertoire de travail :
- et, par exemple, pour le répertoire personnel de glin :
[modifier] Vous voulez voir uniquement les fichiers cachés (et donc pas les répertoires cachés)
Tapez :
pour le premier cas et pour le répertoire personnel de glin :
Pour mieux comprendre les deux dernières commandes, vous pouvez consulter aussi la page sur grep et la section sur les tubes (|).
Les deux dernières commandes supposent 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 deux commandes précédentes.
[modifier] L'expansion des noms de fichiers et les fichiers ou répertoires cachés
[modifier] Introduction : le problème
Vous 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 le Wiki de Mandriva m'a appris à le faire à la section Copie de fichiers ou de répertoires#Reproduire le contenu d'un répertoire existant dans un autre répertoire existant, je vais utiliser le méta-caractère étoile (*) et faire usage de l'option « conservatrice » -a. Vous tapez donc, finalement :
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 [...].
[modifier] 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 lisant cette section du Wiki de Mandriva : Copie de fichiers ou de répertoires#Et si le répertoire de destination n'existe pas ??) :
Ceci vous évite d'avoir à utiliser l'étoile (*), et de ce fait, tous vos fichiers cachés seront, cette fois, bien copiés.
Si vous n'appartenez pas à cette catégorie d'utilisateurs, vous pouvez arrêter ici votre lecture de cette page.
[modifier] Solution 2 : mentionner explicitement le point initial du nom de fichier/répertoire
D'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 répertoires cachés 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 manœuvre...).
Dans un tel cas, vous pourriez être tenté, dans un premier temps (mais attention poursuivez bien votre lecture !), de faire ceci :
ce qui copierait dans le répertoire /home/minouche/ tous les fichiers ou sous-répertoires de votre répertoire de travail dont le nom commence par un point.
Notez qu'ici l'étoile n'a pas à « reconnaître » le point initial et fonctionne donc tout à fait correctement : 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 cependant : la commande qui précède copie tous les fichiers ou répertoires cachés du répertoire de travail et donc aussi des répertoires très particuliers, qui sont à la racine de tout répertoire dans un système Linux : le répertoire « point » (.) qui représente le répertoire lui-même et le répertoire « point point » (..) qui représente le répertoire parent. Si vous voulez, comme il est probable, éviter de copier ces deux répertoires, que pouvez-vous faire ? Vous pouvez dire, par exemple, à la commande cp de ne prendre en compte que des fichiers ou répertoires dont le nom commence par un point obligatoirement suivi d'un autre caractère (ce qui éliminera le répertoire point) et tel que ce second caractère ne soit pas lui-même un point (ce qui éliminera le répertoire « point point »). Vous pouvez faire cela en utilisant les ressources de la notation en crochets de l'expansion des noms de fichiers. Il vous suffira de placer [!.] entre le point initial et l'étoile. Vous pouvez aussi recourir à l'expression équivalente [^.]. Ce qui vous donnera :
ou :
Deux commandes qui demandent à cp de copier tous les fichiers dont le nom commence par un point, obligatoirement suivi d'un second caractère qui n'est pas un point, lui-même suivi de n'importe quoi ou rien...
Les deux commandes qui précèdent présentent encore un petit inconvénient théorique. Si, par extraordinaire, votre répertoire de travail contenait des fichiers ou répertoires cachés dont le nom commence par deux ou plusieurs points, comme ..choin.txt, ...choin.txt, ces fichiers ou répertoires ne seraient pas copiés, puisque le second caractère de leur nom serait un point. L'existence de tels fichiers est toutefois fort improbable… Si vous tenez à ce que d'éventuels fichiers de ce genre soient eux aussi copiés, vous pouvez toutefois recourir à la commande plus complexe suivante :
l'expression ..?* assure que tous les fichiers commençant par plus d'un point et contenant au moins trois caractères (ce qui élimine le répertoire « point point ») seront copiés. D'éventuels ..choin.txt ou ...choin.txt seront alors copiés eux aussi… Avec une telle commande, on est donc absolument certain de copier la totalité des fichiers et répertoires cachés situés à la racine du répertoire de travail, à la seule exception des répertoires « point » et « point point », tout en ne copiant aucun fichier non caché. Vous voyez qu'avec le shell on peut trouver une solution à tout !
Cela dit la solution de la section précédente et celle de la section suivante sont tout de même plus simples…
[modifier] Solution 3 : activer la reconnaissance par le shell du point initial
Enfin, 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 :
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.
Après activation de dotglob l'étoile ne reconnaîtra pas, cependant, et c'est heureux, les fichiers « point » et « point point » qui nous avaient donné du fil à retordre dans la section précédente. La commande que nous venons de mentionner ne copiera donc pas le répertoire « point point » (qui ici serait /home), dans /mnt/MON_DISQUE/toto ce qui est certainement un soulagement pour nous tous. Toujours avec dotglob activé, le joker ? ne les reconnaîtrait pas non plus et une commande cp -a /home/toto/?? /mnt/MON_DISQUE/toto/ copierait par exemple un fichier .a, mais ne copierait pas le répertoire « point point ».
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 :
ce qui désactivera dotglob (-u : de l'anglais unset = désactiver).
[modifier] 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.
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.
[modifier] Le point initial dans une gamme de caractères entre crochets
Notons 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 :
copierait un fichier _a dans le répertoire config/ mais un fichier caché .a ne serait pas copié. Notez bien, cependant, qu'en toute autre position le point serait reconnu. Ainsi, un fichier minouche.gif serait copié sans peine par une commande telle que celle-ci :

