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
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
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.
Vous pouvez exporter un GLOBIGNORE et utiliser "*"
export GLOBIGNORE='ignore1:ignore2'
scp -r source/* remoteurl:remoteDir
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.
Vous pouvez utiliser le globbing étendu comme dans l'exemple ci-dessous:
#Enable extglob
shopt -s extglob
cp -rv !(./excludeme/*.jpg) /var/destination
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.