Solution 1 :
Presque à chaque fois, cela peut être résolu simplement avec :
cp -R .[a-zA-Z0-9]* directory
Il est assez inhabituel d'avoir un fichier caché qui ne commence pas par l'un de ces caractères.
D'autres correspondances de modèles sont disponibles (.??*
, .[^.]*
) - voir les commentaires
Solution 2 :
Mon préféré pour déplacer les répertoires en général a été :
tar cvf - . | (cd /dest/dir; tar xvf -)
qui tarre le répertoire courant vers stdout puis le dirige vers un sous-shell qui est d'abord cd vers le répertoire de destination avant de décompresser stdin. Simple, direct, extensible - considérez ce qui se passe lorsque vous remplacez le () par un ssh vers une autre machine. Ou pour répondre à votre question, vous pourriez faire :
tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
Solution 3 :
Vous pouvez utiliser rsync
.
rsync -a ./ /some/other/directory/
qui copiera le contenu du répertoire courant (y compris les fichiers point, mais pas ..
)
Solution 4 :
Je vous en supplie, éloignez-vous de l'expansion du shell simple sur le cp
ligne de commande - l'expansion du shell a toutes sortes de ahem cas d'angle "intéressants" (récursivité indésirable causée par . et .., espaces, éléments non imprimables, liens physiques, liens symboliques, etc.) Utilisez find
à la place (il vient dans le findutils
package, au cas où vous ne l'auriez pas installé - ce qui serait bizarre, toutes les distributions l'installent par défaut) :
find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;
Explication étape par étape :
-H
causerafind
de ne pas suivre les liens symboliques (sauf si le nom réel du répertoire de niveau supérieur que vous lui avez donné est un lien symbolique ; il suivra.)/path/to/toplevel/dir/
est évidemment censé être remplacé par vous par le chemin d'accès au répertoire qui héberge les fichiers de paramètres et les répertoires que vous souhaitez sauvegarder.-maxdepth 1
arrêterafind
de descendre récursivement dans tous les répertoires dont le nom commence par un point. Nous n'en avons pas besoin pour récursivité,cp
le fera pour nous, nous avons juste besoin des noms à ce niveau.-name '.*'
ditfind
que nous voulons tous les noms qui commencent par un point. Cela ne fonctionnera pas correctement si la variable d'environnementPOSIXLY_CORRECT
est défini, mais rarement (voire jamais). Il s'agit de la première condition de correspondance que nous avons spécifiée jusqu'à présent.a \( ....... \)
est un et suivi d'une condition plus complexe entre parenthèses (j'ai utilisé ..... pour le remplacer, c'est expliqué ci-dessous.) Nous devons échapper aux parenthèses car elles seront autrement (mal) interprétées par le shell, d'où la barre oblique inverse devant eux,-type d -o -type f -o -type l
sont trois conditions avec un ou entre eux.-type d
correspond aux répertoires,-type f
correspond aux fichiers normaux, et-type l
correspond aux liens symboliques. Vous pouvez sélectionner ce que vous voulez - par exemple, si vous ne voulez pas sauvegarder les répertoires de paramètres, omettez-type d
(et le-o
juste derrière, évidemment.)-exec ..... \;
indiquefind
pour exécuter une commande chaque fois qu'une correspondance est rencontrée. La fin de la commande est marquée par un point-virgule, que nous devons à nouveau échapper avec une barre oblique inverse pour éviter l'interprétation du shell. Dans cette ligne de commande, vous devez utiliser{}
où vous voulez que le nom de la correspondance actuellement rencontrée se termine. Étant donné que les shells peuvent également mal interpréter les accolades, vous devez les placer entre apostrophes, comme dans'{}'
. La commande que nous voulons exécuter dans ce cas estcp -a '{}' /path/to/destination/dir/
(-a signifie archive, qui se répète dans les sous-répertoires, copie les liens symboliques sous forme de liens et préserve les autorisations et les attributs étendus, et/path/to/destination/dir/
est évidemment le nom du répertoire de destination - remplacez-le.)
Donc, en langage clair, ce find
la ligne de commande indique ceci :
Commencez à /path/to/toplevel/dir/. Ne descendez dans aucun sous-répertoire. Trouvez tous les répertoires, fichiers et liens symboliques dont le nom commence par un point. Pour chacun de ceux que vous avez trouvé, copiez-le dans /path/to/destination/dir/ en préservant la nature, les autorisations et les attributs étendus.
Solution 5 :
J'ai toujours utilisé .??* pour trouver des fichiers cachés sans avoir "." et "..". Il manque peut-être ".a" ou quelque chose comme ça, mais je n'en ai jamais eu.