web-dev-qa-db-fra.com

utiliser récursivement scp mais en excluant certains dossiers

Supposons qu'il existe des dossiers avec ces structures

/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 constater, je veux utiliser récursivement scp mais en excluant tous les dossiers nommés "fl_X". Il semble que SCP n'a pas une telle option.

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

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

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

52
mahmood

Bien que scp prenne en charge la copie récursive de répertoires avec l'option -r, il ne prend pas en charge le filtrage des fichiers. Il existe 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

La solution rsync peut fonctionner, mais il manque des arguments. rsync a également besoin du commutateur r pour effectuer une récurrence dans des sous-répertoires. De plus, si vous voulez 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
44
jxh

En supposant que l'option la plus simple (l'installation de rsync sur l'hôte distant) ne soit pas réalisable, vous pouvez utiliser sshfs pour monter la télécommande 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:

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 modifications, 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 être transféré à cet endroit (par sshfs). Les fichiers exclus ne doivent cependant pas être transférés.

11
Marian

Vous pouvez exporter un GLOBIGNORE et utiliser "*"

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

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, pas les liens). Utilisez le chemin complet vers votre fichier pem et non pas relatif.

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

2
Ofer Eliassaf

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

#Enable extglob
shopt -s extglob

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

Celui-ci fonctionne bien pour moi car la structure des répertoires n'est pas importante pour moi.

scp -r USER@HOSTNAME:~/bench1/?cpu/p_?/image/ .

En supposant /bench1 se trouve dans le répertoire de base de l'utilisateur actuel. Modifiez également USER et HOSTNAME en valeurs réelles.

0
Fady Ibrahim