file - commande - scp dossier



Comment filtrer les fichiers lors de l'utilisation de scp pour copier le répertoire récursivement? (6)

  1. Copiez votre dossier source sur somedir :

    cp -r srcdir somedir

  2. Supprimer tous les fichiers inutiles:

    trouver somedir -nom '.svn' -exec rm -rf {} \ +

  3. lancer le scp de somedir

https://ffff65535.com

J'ai besoin de copier tous les fichiers .class du serveur en local avec tous les répertoires réservés. Par exemple, le 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 comme les fichiers .svn-base que je ne veux pas. comment puis-je les filtrer, donc je ne scp fichiers .class?


Avec l'authentification par clé ssh activée, le script suivant fonctionnerait.

for x in `ssh [email protected] 'find /usr/some -type f -name *.class'`; do y=$(echo $x|sed 's/.[^/]*$//'|sed "s/^\/usr//"); mkdir -p /usr/project/backup$y; scp $(echo '[email protected]:'$x) /usr/project/backup$y/; done

Il n'y a pas de fonctionnalité dans scp pour filtrer les fichiers. Pour les choses "avancées" comme celle-ci, je recommande d'utiliser rsync:

rsync -av --exclude '*.svn' [email protected]:/my/dir .

(cette ligne copie rsync du dossier distant au dossier actuel)

Les versions récentes de tunnel rsync sur une connexion ssh automatiquement par défaut.


Je recommanderais probablement d'utiliser quelque chose comme rsync pour cela à cause 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 indicateurs utiles:

  • -r pour récursif
  • -a pour l'archive (principalement tous les fichiers)
  • -v pour une sortie détaillée
  • -e pour spécifier ssh au lieu de la valeur par défaut (qui devrait être ssh, en fait)

Puisque vous pouvez scp vous devriez être ok à ssh ,
soit script le suivant ou connectez-vous et exécutez ...

# After reaching the server of interest
cd /usr/some/unknown/number/of/sub/folders
tar cfj pack.tar.bz2 $(find . -type f -name *.class)

retour (déconnexion) sur le serveur local et scp ,

# from the local machine
cd /usr/project/backup/some/unknown/number/of/sub/folders
scp [email protected]:/usr/some/unknown/number/of/sub/folders/pack.tar.bz2 .
tar xfj pack.tar.bz2

Si vous trouvez que le $(find ...) est trop long pour votre changement de goudron,

find . -type f -name *.class | xargs tar cfj pack.tar.bz2

Enfin, puisque vous le gardez dans /usr/project/backup/ ,
pourquoi déranger l'extraction? Gardez simplement le tar.bz2 , avec peut-être un horodatage.


Si vous voulez vraiment utiliser scp, il y a une manière indirecte . Nous voulons copier tout le fichier .jpg dans le dossier local '/ src' vers 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




scp