web-dev-qa-db-fra.com

Comment filtrer les fichiers lors de l'utilisation de scp pour copier les répertoires de manière récursive?

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? 

90
derrdji

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)
137
Gavin Gilmour

Pour exclure les fichiers de points dans le répertoire de base:

scp -r [!.]* server:/path/to/something
61
rgtk

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.

34
Ville Laurikari

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.

8
nik

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
1
Scott Chu

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
1
varun

Commande ci-dessous pour les fichiers.

scp `trouver. -maxdepth 1 -name "* .log" \! -name "hs_err_pid2801.log" -type f` root @ IP:/tmp/test /

  1. IP sera l'adresse IP du serveur de destination.
  2. -name "* .log" pour les fichiers à inclure.
  3. \! -name "hs_err_pid2801.log" pour les fichiers d'exclusion.
  4. . est en cours de travail dir.
  5. -type f pour le type de fichier.

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.

0
Suneet Khurana