web-dev-qa-db-fra.com

Copier de manière récursive Fichiers cachés - Linux

Existe-t-il un moyen facile de copier récursivement tous les fichiers cachés dans un répertoire à un autre répertoire? Je souhaite sauvegarder tous les fichiers de paramètres d'un répertoire de base, pas les fichiers normaux. J'ai essayé:

cp -R .* directory

mais il reconnaît . et .. et copie de manière récursive tous les fichiers non cachés. Y a-t-il un moyen d'obtenir CP d'ignorer . et ..?

19
Zifre

Mon préféré de déplacer DIRS en général a été:

tar cvf - . | (cd /dest/dir; tar xvf -)

ce qui remercne le répertoire actuel sur STDOUT puis la pipe à un sous-groupe que le premier CD est au répertoire de destination avant d'endarrage de Stdin. Simple, direct, extensible - Considérez ce qui se passe lorsque vous remplacez le () avec un SSH à une autre machine. Ou pour répondre à votre question que vous pourriez faire:

tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
15
pjz

Presque chaque fois que cela peut être résolu avec:

cp -R .[a-zA-Z0-9]* directory

Il est assez inhabituel d'avoir un fichier caché qui ne commence pas avec l'un de ces personnages.

D'autres correspondances de motifs sont disponibles (.??*, .[^.]*) - Voir les commentaires

19
Alnitak

Vous pouvez utiliser rsync.

rsync -a ./ /some/other/directory/

qui copiera le contenu du répertoire actuel (y compris les fichiers DOT, mais non compris ..)

11
Rory

Je vous implore, vous éloignez-vous de l'expansion de Shell plain sur la ligne de commande cp - l'expansion de Shell a toutes sortes de ahem Coin "intéressant" Cas (récursions indésirables causées par. et .., espaces, substances non imprimables, hardlinks, liens symboliques, etc.) Utilisez find _ (il est livré dans le package findutils. cas, vous ne l'avez 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 Causer find ne doit pas suivre les symboles (sauf si le nom du répertoire de Toplevel que vous avez donné est un lien symbolique; que cela suivra.)
  • /path/to/toplevel/dir/ est évidemment censé être remplacé par vous avec le chemin d'accès qui héberge les fichiers et répertoires de paramètres que vous souhaitez sauvegarder.
  • -maxdepth 1 Arrêtera find de descendre de manière récursive dans tous les répertoires dont le nom commence par un point. Nous n'avons pas besoin de la recueille, cp le fera pour nous, nous avons juste besoin de noms à ce niveau.
  • -name '.*' Dit find que nous voulons tous les noms commençant par un point. Cela ne fonctionnera pas correctement si la variable d'environnement POSIXLY_CORRECT Est définie, mais elle (si jamais) est rarement. C'est la première condition de match 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, il est expliqué ci-dessous.) Nous devons échapper aux parenthèses Depuis qu'ils seraient autrement (MIS) interprétés par la coquille, d'où la barre oblique tendance devant eux,
  • -type d -o -type f -o -type l Sont trois conditions avec un o entre eux. -type d Correspond aux annuaires, -type f Correspond aux fichiers réguliers et -type l Correspond aux symboles. Vous pouvez sélectionner ce que vous voulez - par exemple, si vous ne voulez pas sauvegarder les annuaires de paramètres, omettez -type d (Et le -o Juste derrière cela, é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 de nouveau échapper avec une barre oblique inverse pour éviter l'interprétation de la coque. Dans cette ligne de commande, vous devez utiliser {} Où vous souhaitez que le nom de la correspondance actuellement rencontrée se retrouve. Étant donné que les coquilles peuvent également interpréter mal les accolades bouclés, vous devriez les placer dans des apostrophes, comme dans '{}'. La commande que nous voulons exécuter dans ce cas est cp -a '{}' /path/to/destination/dir/ (-A signifie archive, qui recoque des sous-répertoires, copie des liens sous forme de liens, et préserve des autorisations et des attributs étendus, et /path/to/destination/dir/ est évidemment le nom du répertoire de destination - remplacez-le.)

Donc, en anglais clair, cette ligne de commande find dit ceci:

Démarrez sur/PATH/TO/TOPLEVEL/DIR /. Ne descendez pas dans des sous-répertoires. Trouvez tous les annuaires, fichiers et symboles dont le nom commence par un point. Pour chacun de ceux que vous avez trouvés trouvés, copiez-le sur/chemin/à/de destination/dirigeant/préservant la nature, les autorisations et les attributs étendus.

10

Beaucoup mieux les réponses ici; https://superuser.com/questions/61611/how-to-copy-with-cp-a-include-Chit-files-and-Chiden-directories-and-their-con

Il décrit par exemple en utilisant ShopT pour une solution de bash natif

0
Roel Van de Paar