J'ai besoin de copier tous les fichiers .class du serveur au local avec tous les dir réservés. par exemple. server:/usr/some/unknown/number/of/sub/folders/me.class
sera /usr/project/backup/some/unknown/number/of/sub/folders/me.class
le problème est, il y a beaucoup d'autres fichiers inutiles tels que les fichiers .svn-base que je ne veux pas. comment puis-je les filtrer afin que je ne ___ que des fichiers scp
.class?
Je recommanderais probablement d'utiliser quelque chose comme rsync
pour cela en raison de ses drapeaux include
et exclude
, par exemple: -
rsync -rav -e ssh --include '*/' --include='*.class' --exclude='*' \
server:/usr/some/unknown/number/of/sub/folders/ \
/usr/project/backup/some/unknown/number/of/sub/folders/
Quelques autres drapeaux utiles:
-r
pour récursif-a
pour l'archive (principalement tous les fichiers)-v
pour une sortie commentée-e
pour spécifier ssh au lieu de la valeur par défaut (qui devrait être ssh, en fait)Pour exclure les fichiers de points dans le répertoire de base:
scp -r [!.]* server:/path/to/something
Scp ne permet pas de filtrer les fichiers. Pour des choses "avancées" comme celle-ci, je vous recommande d'utiliser rsync:
rsync -av --exclude '*.svn' user@server:/my/dir .
(cette ligne copie rsync du dossier distant au dossier actuel)
Les versions récentes du tunnel rsync sur une connexion ssh automatiquement par défaut.
Puisque vous pouvez scp
, vous devriez pouvoir passer à ssh
,
soit écrire le script suivant, soit vous connecter et exécuter ...
# After reaching the server of interest
cd /usr/some/unknown/number/of/sub/folders
tar cfj pack.tar.bz2 $(find . -type f -name *.class)
revenir en arrière (déconnexion) sur le serveur local et scp
,
# from the local machine
cd /usr/project/backup/some/unknown/number/of/sub/folders
scp you@server:/usr/some/unknown/number/of/sub/folders/pack.tar.bz2 .
tar xfj pack.tar.bz2
Si vous trouvez que $(find ...)
est trop long pour que votre goudron change,
find . -type f -name *.class | xargs tar cfj pack.tar.bz2
Enfin, puisque vous le conservez dans /usr/project/backup/
,
pourquoi déranger l'extraction? Il suffit de garder le tar.bz2
, avec peut-être une date + horodatage.
Si vous voulez vraiment utiliser scp, il existe un moyen indirect . Disons que nous voulons copier tous les fichiers .jpg du dossier local '/ src' dans le dossier '/ dst' du serveur distant 10.1.1.2:
#make a clean temp folder
mkdir /tmp/ttt
#copy all .jpg file and retain folder structure as-is
find /src -type f -name *.jpg -exec cp --parents \{\} /tmp/ttt \;
#copy to remote target folder as-is and retain original time attributes
scp -rp /tmp/ttt/* 10.1.1.2:/dst
#if copy ok, remove temp folder
rm -rf /tmp/ttt
Avec l'authentification basée sur la clé ssh activée, le script suivant fonctionnerait.
for x in `ssh user@remotehost 'find /usr/some -type f -name *.class'`; do y=$(echo $x|sed 's/.[^/]*$//'|sed "s/^\/usr//"); mkdir -p /usr/project/backup$y; scp $(echo 'user@remotehost:'$x) /usr/project/backup$y/; done
Commande ci-dessous pour les fichiers.
scp `trouver. -maxdepth 1 -name "* .log" \! -name "hs_err_pid2801.log" -type f` root @ IP:/tmp/test /
Commande ci-dessous pour le répertoire.
scp -r `find. -maxdepth 1 -name "lo *" \! -name "localhost" -type d` root @ IP:/tmp/test /
vous pouvez personnaliser la commande ci-dessus selon vos besoins.