Caricamento di più file tramite FTP utilizzando l'arricciatura


14

Sto provando a caricare tutti i file di testo all'interno della cartella corrente tramite FTP in una posizione del server usando curl. Ho provato la seguente riga:

 curl -T "{file1.txt, file2.txt}" ftp://XXX --user YYY

dove XXX è l'indirizzo IP del server e YYY è il nome utente e la password.

Sono in grado di trasferire file1.txt sul server correttamente, ma si lamenta del secondo file che dice "Impossibile aprire" nome_file "!"

Ho scambiato i nomi dei file e ha funzionato per file2.txt e non per file1.txt. Sembra che la sintassi sia sbagliata, ma questo è ciò che dice il manuale?

Inoltre, idealmente sarei in grado di fare qualcosa del genere:

 curl -T *.txt ftp://XXX --user YYY

perché non conoscerò sempre i nomi dei file txt nella cartella corrente o il numero di file da trasferire.

Sono dell'opinione che potrei dover scrivere uno script bash che raccolga l'output di ls *.txtin un array e lo inserisca nel formato a più file richiesto da curl.

Non ho mai fatto script di Bash prima - è questo il modo più semplice per raggiungere questo obiettivo?

Risposte:


20

Il tuo primo comando dovrebbe funzionare senza spazi bianchi:

curl -T "{file1.txt,file2.txt}" ftp://XXX/ -user YYY

Nota anche il "/" finale negli URL sopra.

Questa è la voce manuale del ricciolo sull'opzione "-T":

-T, --upload-file

Ciò trasferisce il file locale specificato nell'URL remoto. Se l'URL specificato non contiene parti di file, Curl aggiungerà il nome del file locale. NOTA che devi usare un finale / sull'ultima directory per dimostrare davvero a Curl che non esiste un nome file o che curl penserà che il tuo ultimo nome directory sia il nome del file remoto da usare. Ciò molto probabilmente causerà il fallimento dell'operazione di caricamento. Se utilizzato su un server HTTP (S), verrà utilizzato il comando PUT.

Usa il nome del file "-" (un singolo trattino) per usare lo stdin invece di un determinato file. In alternativa, il nome del file "." (un solo periodo) può essere specificato invece di "-" per utilizzare stdin in modalità non bloccante per consentire la lettura dell'output del server durante il caricamento di stdin.

È possibile specificare uno -T per ciascun URL sulla riga di comando. Ogni coppia -T + URL specifica cosa caricare e dove. curl supporta anche il "globbing" dell'argomento -T, il che significa che è possibile caricare più file su un singolo URL utilizzando lo stesso stile globbing dell'URL supportato nell'URL, in questo modo:

curl -T "{file1,file2}" http://www.uploadtothissite.com

o anche

curl -T "img[1-1000].png" ftp://ftp.picturemania.com/upload/

L'espansione "* .txt" non funziona perché l'arricciatura supporta solo la stessa sintassi degli URL:

È possibile specificare più URL o parti di URL scrivendo set di parti tra parentesi graffe come in:

http: // site . {uno, due, tre} .com

oppure puoi ottenere sequenze di serie alfanumeriche usando [] come in:

ftp://ftp.numericals.com/file[1-100].txt

ftp://ftp.numericals.com/file[001-100[.txt (con zeri iniziali)

ftp://ftp.letters.com/file[az].txt

[...]

Quando si usano sequenze [] o {} quando vengono invocate da un prompt della riga di comando, probabilmente è necessario inserire l'URL completo tra virgolette doppie per evitare che la shell interferisca con esso. Questo vale anche per altri personaggi trattati in modo speciale, come ad esempio "&", "?" e '*'.

Ma potresti usare il "normale" gorgoglio della shell in questo modo:

curl -T "{$(echo *.txt | tr ' ' ',')}" ftp://XXX/ -user YYY

(L'ultimo esempio potrebbe non funzionare in tutte le shell o con qualsiasi tipo di nome di file esotico.)


$(perl -e 'print join(",",@ARGV)' *.txt)gestirà correttamente i nomi dei file con spazi.
ivan_pozdeev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.