2012-08-06 23 views
5

Mi piacerebbe mettere i file da risultato di! Find comando da lftp.come reindirizzare il comando risultato "! Find ..." per inserire il comando lftp

ho provato:

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

ma non è riuscito !!

questo ha funzionato:

$> 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 

C'è un altro modo !? Mi piacerebbe usare reindirizzamenti stdio (pipe, stdin ...).

+1

'mput' è il modo tipico per richiedere file "multipli" su ftp (invece di solo "put"). Non ho sentito parlare di 'lftp' e sarò sorpreso se' mput shellter

+0

sono d'accordo con te! Anche "mput

+0

Non credo che sarò in grado di aiutarlo perché non so nulla di lftp. È l = linux? Potrebbe essere utile aggiungere un tag alla tua domanda per indicare il tuo sistema operativo. modifica la tua domanda per includere le informazioni nel commento sopra, formattata per essere utile per altri lettori ;-) Buona fortuna. – shellter

risposta

4

Ho letto l'intero man lftp(1) e sembra che il il modo in cui hai scelto sia effettivamente il migliore.

  1. ! comando non supporta abbinamento diretto con un altro comando, come si è tentato put < !find ...
  2. L'unico modo per caricare i file sta usando put, mput o mirror. mirror non è utile per te come hai notato, perché conserva il percorso.
  3. put o mput i comandi non supportano alcun mezzo per specificare un file con un elenco di file da caricare.

Quindi, l'unica possibilità è quello che hai: generare lo script e utilizzare source per eseguirlo.

Cosa si potrebbe provare è quello di mettere tutti i file in un unico comando mput:

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

ma attenzione: anche se non ho trovato nella documentazione, ci potrebbe essere la limitazione per la massima dimensione line! Quindi penso che alla fine la tua strada sia la migliore.

notare che è possibile anche il codice-golf comando per:

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

La soluzione 'mput' che hai dato è praticamente ciò che ho provato ieri. Per quanto riguarda la limitazione, ho provato con> 2000 nomi di file e ha funzionato. +1 – greg0ire

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

Il comando sed circonda ogni linea di uscita di find con doppi apici (") e antepone un put. Funzionerà per nomi di file che contengono spazi e altri caratteri critici, ma fallirà per nomi di file contenenti doppi apici, interruzioni di riga, ... Potresti estendere il substituition eseguito da sed in accordo, se ti capita di avere questi caratteri nei nomi dei file .

Si noti che la barra inversa (\) davanti al segno tubo (|), sono necessari il doppio e apostrofi per sfuggire interpretazione da parte della linea di parser lsftp di comando.Per testare il comando su un sh -come shell, uso:

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

Se si conosce la profondità massima della directory local, è possibile utilizzare il comando pianura mput come questo:

lcd local && mput * */* */*/* */*/*/*