GNU/Linux >> Tutoriels Linux >  >> Linux

Copie récursive de fichiers cachés - Linux

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 causera find 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êtera find 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 '.*' dit find que nous voulons tous les noms qui commencent par un point. Cela ne fonctionnera pas correctement si la variable d'environnement POSIXLY_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 ..... \; indique find 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 est cp -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.


Linux
  1. Masquer les fichiers cachés Linux dans Windows

  2. Comptage récursif des fichiers dans un répertoire Linux

  3. Comment chmod et chown fichiers cachés sous Linux?

  4. utiliser SED de manière récursive sous Linux ?

  5. Un moyen rapide de compter les fichiers de manière récursive sous Linux

Commande Rm sous Linux

Comment modifier récursivement les autorisations de fichiers sous Linux

Comment rechercher et répertorier récursivement les fichiers par date sous Linux

Rsync Afficher la barre de progression lors de la copie de fichiers sous Linux

Comment lister les fichiers de manière récursive sous Linux

Comment afficher les fichiers cachés sous Linux