Copie de fichier récursive sans remplacement?

21

J'ai un répertoire qui contient un tas d'autres dossiers contenant des fichiers CoffeeScript / JavaScript. Je suis en mesure de compiler les fichiers CoffeeScript dans un nouveau dossier avec la même structure de dossiers fine.

Ce que je veux faire, c'est copier tous les fichiers * .js du dossier source dans le dossier de destination de manière récursive. Je ne veux pas non plus écraser les fichiers qui sont déjà présents dans le dossier de destination. Avez-vous des idées sur la façon d'accomplir cela?

J'ai essayé d'utiliser cp -n source/**.js desination/et cp -Rn source/**.js desination/après avoir regardé une autre question similaire, mais cela ne semble pas fonctionner.

Une idée de comment y parvenir?

AlbertEngelB
la source
Avez-vous jeté un œil à rsync?
bonob
@bonob je n'ai pas non. Je l'ai utilisé une ou deux fois, mais uniquement pour récupérer des fichiers à distance.
AlbertEngelB

Réponses:

25

Vous pouvez utiliser rsync (il fait également une copie locale)

rsync -r --ignore-existing --include=*/ --include=*.js --exclude=* source/ destination
  • -r pour rentrer dans les répertoires,
  • --ignore-existing ignorer les fichiers existants dans la destination,
  • les filtres includeet excludesignifient: inclure tous les répertoires, inclure tous les fichiers * .js, exclure les autres; la première inclusion est nécessaire, sinon l'exclusion finale exclura également les répertoires avant que leur contenu ne soit analysé.

Enfin, vous pouvez ajouter un -Psi vous voulez regarder la progression, un --list-onlysi vous voulez voir ce qu'il copiera sans réellement copier et un -tsi vous voulez conserver les horodatages.


Ce n'est pas lié, mais j'ai récemment appris la commande rsync, lorsque j'ai déplacé 15 ans de documents d'une partition à une autre. Confiant que mes fichiers étaient là, j'ai ensuite effacé l'ancienne partition et y ai ajouté d'autres choses; J'ai réalisé plus tard que j'avais perdu tous les horodatages et découvert le drapeau -t. Je voulais juste partager ma détresse: '(

bonob
la source
Haha, celui-ci a fonctionné! rsyncest apparemment la bombe.
AlbertEngelB
3
Oui, je le sais à peine, mais je viens d'en apprendre beaucoup en essayant de répondre à votre question. Si vous avez besoin d'aller plus loin dans le futur, vous pouvez définir des filtres complexes dans des fichiers et les appeler dans la commande par exemple. Vous pouvez également avoir des filtres par répertoire, compresser les données lors de la copie, et cela ne fait qu'effleurer la surface de celui-ci!
bonob
7

Ceci est également réalisable en utilisant cp. Vois ici:

sudo cp -vnpr /xxx/* /yyy

xxx = source

yyy = destination

v = verbeux

n = pas de clobber (pas d'écrasement)

p = conserver les autorisations

r = récursif

SEMbyotic
la source
5

En regardant les pages de manuel, il semble que vous vouliez l' -noption.

-n, --no-clobber
   do not overwrite an existing file (overrides the previous -i option)
tantale
la source
J'ai essayé d'utiliser -n, mais cela ne me permet pas de filtrer par les fichiers * .js.
AlbertEngelB
0

Ma distribution n'était pas disponible, donc:

echo n | cp -vipr xxx yyy

xxx = source

yyy = destination

v = verbeux

i = interactif (invite à écraser) | c'est pourquoi la commande est précédée de "echo n |"

p = conserver les autorisations

r = récursif

Octavian
la source