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 ..
?
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 -)
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
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 ..
)
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
Causerfind
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êterafind
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 '.*'
Ditfind
que nous voulons tous les noms commençant par un point. Cela ne fonctionnera pas correctement si la variable d'environnementPOSIXLY_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 ..... \;
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 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 estcp -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.
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