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

StackOverflow https://stackoverflow.com/questions/1228466

Question

Je dois copier tous les fichiers .class du serveur au local avec tous les répertoires réservés. par exemple. serveur: /usr/some/unknown/number/of/sub/folders/me.class sera / usr / project / backup / some / unknown / number / of / sub / folder /me.class le problème est qu’il existe de nombreux autres fichiers inutiles tels que les fichiers .svn-base que je ne souhaite pas. Comment puis-je les filtrer afin que je ne comprenne que les scp fichiers .class?

Était-ce utile?

La solution

Je recommanderais probablement d'utiliser quelque chose comme rsync pour cela en raison de ses indicateurs 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)

Autres conseils

Pour exclure les fichiers de points du répertoire de base:

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

[!.] * est un glob shell qui s'étend à tous les fichiers du répertoire de travail ne commençant pas par un point.

Il n'y a pas de fonctionnalité dans scp pour filtrer les fichiers. Pour " avancé " des trucs comme ça, je 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 être en mesure de 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)

retourner au 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 le $ (trouver ...) est trop long pour que votre fichier tar devienne,

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? Conservez simplement le tar.bz2 , avec peut-être un horodatage.

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 `find. -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 inclure des fichiers.
  3. \! -name " hs_err_pid2801.log " pour exclure des fichiers.
  4. . est le répertoire de travail actuel.
  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.

Si vous voulez vraiment utiliser scp, il existe un moyen indirect . Dites 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. Copiez votre dossier source dans somedir :

    cp -r srcdir somedir

  2. Supprimer tous les fichiers inutiles:

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

  3. lancer scp à partir de somedir

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top