Je souhaite copier les fichiers modifiés dans un référentiel svn vers un autre répertoire, tout en conservant leur structure de répertoires.
Après avoir lu la page de manuel awk et xargs, je trouve un moyen d'obtenir des noms de fichiers modifiés comme ceci:
$ svn status -q | awk '{ print $2 }' | xargs -d \\n -I '{}' cp '{}' /tmp/xen/
Mais le problème est que de cette manière les structures de répertoires ne sont pas conservées, je veux copier des fichiers comme ceci:
./common/superp.c -> /tmp/xen/common/superp.c
./common/m2mgr.c -> /tmp/xen/common/m2mgr.c
./common/page_alloc.c -> /tmp/xen/common/page_alloc.c
./arch/x86/mm.c -> /tmp/xen/arch/x86/mm.c
./arch/x86/mm/shadow/private.h -> /tmp/xen/arch/x86/mm/shadow/private.h
J'ai essayé de changer la commande cp en cp '{}' / tmp / xen / '{}' mais elle n'a dit aucun tel fichier ou répertoire. Existe-t-il un moyen de créer un fichier de copie cp et de créer un répertoire si nécessaire? Et veuillez indiquer si cette chaîne de commande peut être simplifiée. :-)
Merci pour toutes vos réponses. Puisque le répertoire est un peu grand, je ne veux pas copier tout le répertoire en utilisant cp -R ou rsync. La suggestion de CK d'utiliser un tuyau de goudron est très utile.
svn status -q | awk '{ print $2 }' | xargs tar cf - | (cd /tmp/xen/; tar xvf -)
la source
Voici cette doublure pour référence:
Et en anglais:
svn status -q
, qui est canalisée dans ...awk '{print $2}'
xargs tar -c
-x
) dans le répertoire cible (-C path
):tar -xC /tmp/xen
la source
Utilisez "dirname" pour extraire le chemin "mkdir -p" pour le créer, quelque chose comme:
la source
rsync -a ne crée pas de nouveaux répertoires plus profondément qu'en profondeur 1, donc rsync n'est qu'une solution partielle et par exemple ne me convient pas (j'ai cherché sur google pour trouver une réponse comment rsync des répertoires vers une hiérarchie distante lorsque plusieurs répertoires manquent au milieu )
Edit: Je veux dire, j'ai le répertoire source: /home/user/projects/homework/1/1.1/ Et je veux le resynchroniser à distance: /home/user/projects/homework/1/1.1/ ... mais la destination n'a pas encore de répertoire / home / user / projects / homework ... et je ne veux pas transférer d'autres sous-répertoires dans la machine source qui sont dans / home / user / projects /
Edit2: a trouvé un moyen, avec l'option rsync --relative: l'exemple ci-dessus se présenterait comme suit:
cd / home / projets /; rsync -aR devoirs / 1 / 1.1 user @ remote: / home / user / projects /
la source
Je suggère ce qui suit:
Soit dit en passant, cp avec l'indicateur R copie les fichiers / dossiers de manière récursive.
la source
créer une structure de répertoires
/tmp/f2
pour les fichiers dans/tmp/f
copier le fichier dans une nouvelle destination
/tmp/f2/
la source