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 :
-Hcauserafindde 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 1arrêterafindde descendre récursivement dans tous les répertoires dont le nom commence par un point. Nous n'en avons pas besoin pour récursivité,cple fera pour nous, nous avons juste besoin des noms à ce niveau.-name '.*'ditfindque nous voulons tous les noms qui commencent par un point. Cela ne fonctionnera pas correctement si la variable d'environnementPOSIXLY_CORRECTest 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 lsont trois conditions avec un ou entre eux.-type dcorrespond aux répertoires,-type fcorrespond aux fichiers normaux, et-type lcorrespond 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-ojuste derrière, évidemment.)-exec ..... \;indiquefindpour 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.