Me gustaría canalizar la salida de find en la lista de entrada de scp, ¿cómo?

10

Soy un usuario novato de Linux y estoy tratando de enviar una larga lista de archivos de una computadora a otra. La lista de argumentos es demasiado larga, por lo que estoy usando find. Sin embargo, tengo problemas para configurar la expresión. Alguien puede ayudar?

Esto es lo que normalmente escribiría para una breve lista de argumentos.

scp ./* phogan@computer/directory...

Aquí creo que esto podría traducirse con find.

scp find . -name "*" phogan@computer/directory...

¿Tal vez podría usar tuberías? Cualquier sugerencia ayudaría. Gracias por adelantado.

usuario13184
fuente

Respuestas:

16
find . -name "*" -exec scp '{}' phogan@computer:/directory ';'

Normalmente 'alquilaría' todos los archivos juntos en un gran blob y llamaría 'scp' solo una vez. Algo como esto:

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory
  • Uno podría jugar con los parámetros --exclude = o --include = de tar.
  • Otra opción sería usar rsync .
akira
fuente
si usa contraseñas con ssh / scp, ¿la solución con find no solicitaría una contraseña en cada archivo?
quack quijote
deja apenas asume que sabe cómo utilizar llaves ssh :) El problema con 1000 preguntas de contraseña es también la razón por la tar-enfoque
Akira
15

Puedes hacerlo con un solo comando scp.

  • para versiones más nuevas de scp:
scp `find <path> -name <expression>` user@host:<path_where_to_copy>
  • para versiones anteriores:
scp --exec=`find <path> -name <expression>` user@host:<path_where_to_copy>

Asegúrese de encapsular el findcomando entre comillas invertidas ` y no comillas simples ' .

Carlos Rodrigues
fuente
¿Qué versión de scp, qué distribución de Linux es esa? Por ejemplo, scp en Ubuntu 14.04 no tiene esta opción.
geekQ
2
Hola, las versiones anteriores lo admiten, las nuevas versiones admiten un comando más simple:scp `find <path> -name <expression>` user@host:<path_where_to_copy>
Carlos Rodrigues
1
No funciona en varios archivos
Amruta
@Amruta use-r
slybloty
@slybloty scp -res para la recursión en una sola entrada (directorio), no para múltiples entradas (múltiples archivos).
AndrewF
2
for f in `find . -name "*"`;do scp $f phogan@computer/directory;done
John T
fuente
sí quiere un solo comando de todos modos
John T
útil, lo usé congrep -l pattern *
Tanj
No parece funcionar en archivos con espacios en ellos.
Christophe De Troyer
1

Yo sugeriría

find . -print0 | tar --null --files-from=/dev/stdin -cf - | ssh phogan@computer tar -xf - -C /directory

Tenga en cuenta que esta solución evita tener los nombres de los archivos en la línea de comandos donde podrían interpretarse como argumentos de la línea de comandos.

Otra cosa a tener en cuenta es que los nombres de archivo pueden contener espacios. Esto significa que un bucle for en bash podría tener dificultades con una lista de nombres de archivo.

Erik Sjölund
fuente