87 votes

utiliser récursivement scp mais en excluant certains dossiers

Supposons qu'il y ait des dossiers avec les structures suivantes

/bench1/1cpu/p_0/image/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_1/image/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/2cpu/p_0/image/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_1/image/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
....

Ce que je veux faire, c'est scp les dossiers suivants

/bench1/1cpu/p_0/image/
/bench1/1cpu/p_1/image/
/bench1/2cpu/p_0/image/
/bench1/2cpu/p_1/image/

Comme vous pouvez le voir, je veux utiliser récursivement scp mais en excluant tous les dossiers dont le nom est "fl_X". Il semble que scp n'ait pas cette option.

UPDATE scp n'a pas cette fonctionnalité. A la place, j'utilise la commande suivante

 rsync -av --exclude 'fl_*' user@server:/my/dir

Mais ça ne marche pas. Il ne transfère que la liste des dossiers ! quelque chose comme ls -R

69voto

jxh Points 32720

Bien que scp supporte la copie récursive de répertoires avec l'option -r il ne prend pas en charge le filtrage des fichiers. Il y a plusieurs façons d'accomplir votre tâche, mais je me fierais probablement à find , xargs , tar et ssh au lieu de scp .

find . -type d -wholename '*bench*/image' \
| xargs tar cf - \
| ssh user@remote tar xf - -C /my/dir

En rsync Il est possible de faire fonctionner la solution, mais il vous manque des arguments. rsync a également besoin de la r pour faire des recherches dans les sous-répertoires. En outre, si vous souhaitez bénéficier de la même sécurité que scp vous devez effectuer le transfert sous ssh . Quelque chose comme :

rsync -avr -e "ssh -l user" --exclude 'fl_*' ./bench* remote:/my/dir

28voto

Nautical Points 422

Vous pouvez spécifier GLOBIGNORE et utiliser le modèle *

GLOBIGNORE='ignore1:ignore2' scp -r source/* remoteurl:remoteDir

Il se peut que vous souhaitiez établir des règles générales que vous pouvez combiner ou remplacer à l'aide de la fonction export GLOBIGNORE mais pour une utilisation ad-hoc, les éléments ci-dessus suffisent. Le site : est utilisé comme délimiteur pour les valeurs multiples.

12voto

Marian Points 1640

En supposant que l'option la plus simple (installation de rsync sur l'hôte distant) n'est pas réalisable, vous pouvez utiliser la méthode suivante sshfs pour monter le site distant localement, et rsync à partir du répertoire de montage. De cette façon, vous pouvez utiliser toutes les options offertes par rsync, par exemple --exclude .

Quelque chose comme ça devrait faire l'affaire :

sshfs user@server: sshfsdir
rsync --recursive --exclude=whatever sshfsdir/path/on/server /where/to/store

Notez que l'efficacité de rsync (transférer uniquement les changements, pas tout) ne s'applique pas ici. En effet, pour que cela fonctionne, rsync doit lire le contenu de chaque fichier pour voir ce qui a changé. Cependant, comme rsync ne fonctionne que sur un seul hôte, le fichier entier doit y être transféré (par sshfs). Les fichiers exclus ne doivent cependant pas être transférés.

3voto

Ofer Eliassaf Points 1738

Si vous utilisez un fichier pem pour vous authentifier, vous pouvez utiliser la commande suivante (qui exclura les fichiers avec une extension) :

rsync -Lavz -e "ssh -i <full-path-to-pem> -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --exclude "*.something" --progress <path inside local host> <user>@<host>:<path inside remote host>

Le -L signifie suivre les liens (copier les fichiers et non les liens). Utilisez le chemin complet de votre fichier pem et non le chemin relatif.

L'utilisation de sshfs n'est pas recommandée car il fonctionne lentement. De même, la combinaison de find et scp présentée ci-dessus est également une mauvaise idée car elle ouvre une session ssh par fichier, ce qui est trop coûteux.

1voto

WackGet Points 2197

Vous pouvez utiliser le globbing étendu comme dans l'exemple ci-dessous :

#Enable extglob
shopt -s extglob

cp -rv !(./excludeme/*.jpg) /var/destination

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X