Comment filtrer les fichiers lors de l'utilisation de scp pour copier les répertoires de manière récursive?
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?
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 /
- IP sera l'adresse IP du serveur de destination.
- -name " *. log " pour inclure des fichiers.
- \! -name " hs_err_pid2801.log " pour exclure des fichiers.
- . est le répertoire de travail actuel.
- -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
-
Copiez votre dossier source dans
somedir
:cp -r
srcdir
somedir
-
Supprimer tous les fichiers inutiles:
trouver un nom-. '.svn' -exec rm -rf {} \ +
-
lancer scp à partir de
somedir