2012-08-06 18 views
5

Me gustaría poner archivos del resultado del comando! Find de lftp.cómo redirigir el resultado "! Find ..." comando para poner el comando lftp

me trataron:

$> lftp -u foo, sftp://bar 
lftp [email protected]$> put < !find ./local -type f 

pero falló !!

Esto funcionó:

$> lftp -u foo, sftp://bar 
lftp [email protected]$> !find ./local -type f | awk '{print "put "$1}' > /tmp/files.lftp 
lftp [email protected]$> source /tmp/files.lftp 

¿Hay otra manera !? Me gustaría usar stdio redirects (pipes, stdin ...).

+1

'mput' es la forma típica de solicitar 'múltiples' archivos en ftp (en lugar de solo 'put'). No he oído hablar de 'lftp' y me sorprendería si' mput shellter

+0

estoy de acuerdo contigo! El 'mput

+0

No creo que pueda ayudar con eso, ya que no sé nada sobre lftp. ¿Es eso l = linux? Podría ser útil agregar una etiqueta a su pregunta para indicar su sistema operativo. Y, debe edite su pregunta para incluir la información en el comentario anterior, formateada para ser útil para otros lectores ;-) Buena suerte. – shellter

Respuesta

4

He leído todo el man lftp(1) y parece que la forma que ha elegido es en realidad la mejor.

comando
  1. ! no admite la combinación directa con otros comandos, como se ha intentado put < !find ...
  2. La única forma de subir archivos está utilizando put, mput o mirror. mirror no sirve para usted como lo señaló, porque conserva el camino.
  3. put o mput Los comandos no admiten ningún medio para especificar un archivo con la lista de archivos para cargar.

Entonces, la única posibilidad es la que tiene: generar el script y usar source para ejecutarlo.

Lo que podría intentar es poner todos los archivos en el mismo comando mput:

!find ./local -type f | awk -v ORS=" " 'BEGIN{print "mput "}{print}' > /tmp/files.lftp 

pero tenga cuidado: aunque yo no lo he encontrado en la documentación, puede haber limitaciones de tamaño máximo de la línea! Así que creo que al final tu camino es la mejor manera de hacerlo.

Tenga en cuenta que también se puede código de golf a su comando:

!find ./local -type f -printf "put %p\n" > /tmp/files.lftp 
+0

La solución 'mput' que dio es más o menos lo que intenté ayer. En cuanto a la limitación, probé con> 2000 nombres de archivos, y funcionó. +1 – greg0ire

3
source -e find ./local -type f \| sed \'s/^\(.*\)$/put \"\1\"/\' 

El comando sed rodea cada línea de salida de find con comillas dobles (") y antepone un put. Esto funcionará para nombres de archivos que contengan espacios y algunos otros caracteres críticos, pero fallará para nombres de archivos que contengan comillas dobles, saltos de línea, ... Puede extender la sustitución realizada por sed de acuerdo, si tiene tales caracteres en sus nombres de archivo .

Tenga en cuenta que la barra invertida (\) delante del signo tubería (|), se necesita el doble y comillas simples para escapar de interpretación por parte de la línea de comandos del analizador lsftp.Para probar el comando en un sh -como cáscara, utilice:

find ./local -type f | sed 's/^\(.*\)$/put "\1"/' 
1

Si conoce la profundidad máxima del directorio local, puede utilizar comandos llanura mput así:

lcd local && mput * */* */*/* */*/*/* 
Cuestiones relacionadas