¿Cómo copio todos los archivos y directorios, excepto algunos sobre ssh?

23

Usando la línea de comando de Linux, uso el scpcomando para copiar todos los archivos y carpetas de un determinado directorio. Sin embargo, no me gusta consumir ancho de banda, para copiar cosas rara vez cambio como mi tiny_mcecarpeta. ¿Cuál es el truco para copiar todo, pero omitir una breve lista de carpetas?

Michael Prokopec
fuente

Respuestas:

19

rsyncfunciona bien y, en la mayoría de los casos, usa SSH automáticamente como protocolo de transporte. Comparará los archivos y solo cargará los que hayan cambiado, pero también puede usar una lista de exclusión para especificar archivos en el árbol que de todos modos no se deben modificar.

Anthon
fuente
rsync no usa SSH automáticamente: debe proporcionar los indicadores "-e ssh" para hacerlo.
44
Si lo hace. Lanzamiento de Rsync 2.6.0: el shell remoto predeterminado ahora es "ssh" a menos que le diga a configure que desea hacer que otra cosa sea la predeterminada. samba.org/rsync
12

Puede probar rsync que solo copia archivos que han cambiado, también funciona a través de ssh.


fuente
9

El uso rsync --excludees la opción más obvia aquí, pero si realmente desea enviar algunos archivos o carpetas y tiene algo específico para excluir, puede usar la función de globo de shell scp. Primero asegúrese de tener las opciones correctas de gloging establecidas en su shell. Para bash run shopt -s extgloby para uso de zsh setopt ksh_glob. Entonces algo como esto:

scp /path/to/folder/!(tiny_mce|other_folder|*.bak) user@host:target_path

... copiaría todo en la carpeta de origen, excepto las cosas que coinciden con el patrón dado. Obviamente puedes ser creativo con esa parte.

Caleb
fuente
7

rsync es una buena solución, pero si buscas una alternativa:

Digamos que tenemos un directorio "prueba" que contiene los directorios "foo, bar, baz". En estos directorios hay un montón de diferentes tipos de archivos:

test
|____bar
| |____1.jpg
| |____1.png
| |____1.txt
| |____2.jpg
| |____2.png
| |____2.txt
|____baz
| |____1.avi
| |____2.avi
| |____3.png
|____foo
| |____test.blah
|____test.txt

Queremos copiar todo excepto los PNG

scp $(find /location/of/test -type f ! -name "*.png") # -> Note the logical NOT!!

En este ejemplo, el comando colocará todos los archivos en el mismo directorio de destino; este puede no ser el comportamiento que desea.

Anthon
fuente
1
Tenga en cuenta que esta respuesta solo funciona si los nombres de archivo y directorio involucrados no contienen caracteres especiales de shell (espacios en blanco o \[*?).
Gilles 'SO- deja de ser malvado'
3

Una gran herramienta que puede probar es "lftp".

lftp sftp://etc.etc/ 
lftp> ls 
    --- remote listing ---
lftp> mirror -R -n local/ remote/

También puede usar RSync sobre ssh

rsync -avzp -e ssh /this/dir/  remoteuser@remotehost:/remote/dir/

Deberia trabajar.

Kent Fredric
fuente
0

Acabo de terminar de escribir cómo prefiero unísono a rsync cualquier día, ya que

  • no necesita un demonio, aparte de ssh para el transporte
  • me permite modificar archivos en cualquier lado en cualquier momento: múltiples maestros fácilmente, mientras que solo necesito enviar una solicitud de sincronización de un lado
  • Soy muy exigente cuando se trata de modtime, atributos / permisos, enlaces suaves, etc. No hay problemas con eso; para un proyecto incluso uso 4 espejos, uno de ellos es un host cygwin. Vea mi ejemplo de configuración de crontab.
  • admite exclusiones como *.bak. Muestras en mi archivo de configuración
Marcos
fuente
0

Uso de copia segura - scp

scp -r file user@host:

Para copiar muchos archivos

scp /directory/* user@host:destinationPath

Para copiar algunos archivos

scp /directory/!(*.doc) user@host:destinationPath

Copia el contenido del directorio excepto los archivos .doc

Yogeesh HT
fuente
0

Sin duda te recomendaría rsync.

rsync -vra --exclude = "lo que quiere excluir" -e ssh folder user @ remotehost: / folder

amit singh
fuente
0

Esto es lo que funcionó para mí cuando lo ejecuté desde el servidor de destino.

rsync -av --progress user@servername:/sourcefolder /destinationfolder --exclude thefoldertoexclude
usuario2373210
fuente
0

Podemos hacerlo en dos pasos para ignorar el tiny_mcedirectorio. Suponiendo que todos los directorios comienzan con letras minúsculas.

scp -r USER@HOSTNAME:~/FOLDER/[a-s]* .
scp -r USER@HOSTNAME:~/FOLDER/[u-z]* .

Además, cambie USER, HOSTNAME y FOLDER a los valores reales.

Fady Ibrahim
fuente