Pregunta

Necesito copiar todos los archivos .class del servidor a local con todo el directorio reservado. p.ej. El servidor : /usr/some/unknown/number/of/sub/folders/me.class será / usr / project / backup / some / unknown / number / of / sub / folder /me.class el problema es que hay muchos otros archivos inútiles como .svn-base que no quiero. ¿Cómo puedo filtrarlos para que solo scp .class archivos?

¿Fue útil?

Solución

Probablemente recomendaría usar algo como rsync para esto debido a sus banderas include y exclude , por ejemplo: -

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/

Algunas otras banderas útiles:

  • -r para recursivo
  • -a para archivo (principalmente todos los archivos)
  • -v para salida detallada
  • -e para especificar ssh en lugar del predeterminado (que debería ser ssh, en realidad)

Otros consejos

Para excluir archivos de puntos en el directorio base:

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

[!.] * es un globo de shell que se expande a todos los archivos en el directorio de trabajo que no comienza con un punto.

No hay ninguna función en scp para filtrar archivos. Para "avanzado" cosas como esta, recomiendo usar rsync:

rsync -av --exclude '*.svn' user@server:/my/dir .

(esta línea copia rsync de la carpeta distante a la actual)

Versiones recientes del túnel rsync sobre una conexión ssh automáticamente por defecto.

Dado que puede scp , debe aceptar ssh ,
ya sea escribir lo siguiente o iniciar sesión y ejecutar ...

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

regresar (cerrar sesión) al servidor local y 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 encuentra que el $ (find ...) es demasiado largo para que su cambio de tar sea,

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

Finalmente, ya que lo está manteniendo en / usr / project / backup / ,
¿Por qué molestarse en la extracción? Simplemente mantenga el tar.bz2 , con quizás una marca de fecha y hora.

Con la autenticación basada en clave ssh habilitada, el siguiente script funcionaría.

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

Debajo del comando para archivos.

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

  1. IP será la dirección IP del servidor de destino.
  2. -name " *. log " para incluir archivos.
  3. \! -nombre " hs_err_pid2801.log " para excluir archivos.
  4. . es el directorio de trabajo actual.
  5. -tipo f para el tipo de archivo.

Debajo del comando para el directorio.

scp -r `buscar. -maxdepth 1 -name " lo * " \! -nombre " localhost " -type d` root @ IP: / tmp / test /

puede personalizar el comando anterior según sus requisitos.

Si realmente quiere usar scp, hay una forma indirecta . Decir que queremos copiar todos los archivos .jpg en la carpeta local '/ src' a la carpeta '/ dst' en el servidor remoto 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. Copie su carpeta de origen a somedir :

    cp -r srcdir somedir

  2. Eliminar todos los archivos innecesarios:

    find somedir -name '.svn' -exec rm -rf {} \ +

  3. iniciar scp desde somedir

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top