Mengunggah banyak file melalui FTP menggunakan curl

14

Saya mencoba mengunggah semua file teks dalam folder saat ini melalui FTP ke lokasi server menggunakan curl. Saya mencoba baris berikut:

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

di mana XXX adalah alamat IP server dan YYY adalah nama pengguna dan kata sandi.

Saya dapat mentransfer file1.txt ke server dengan sukses, tetapi mengeluh tentang file kedua yang mengatakan 'Tidak dapat membuka' nama_file '!'

Saya bertukar nama file dan itu bekerja untuk file2.txt dan bukan file1.txt. Sepertinya saya salah sintaks, tapi ini yang dikatakan manual?

Juga, idealnya saya bisa melakukan sesuatu seperti ini:

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

karena saya tidak akan selalu tahu nama-nama file txt di folder saat ini atau jumlah file yang akan ditransfer.

Saya berpendapat saya mungkin harus menulis skrip bash yang mengumpulkan output ls *.txtke dalam array dan memasukkannya ke dalam beberapa file-format yang diperlukan oleh curl.

Saya belum pernah melakukan bash scripting sebelumnya - apakah ini cara paling sederhana untuk mencapai ini?

JJT
sumber

Jawaban:

20

Perintah pertama Anda harus bekerja tanpa spasi putih:

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

Perhatikan juga tanda "/" di URL di atas.

Ini adalah entri manual curl tentang opsi "-T":

-T, --upload-file

Ini mentransfer file lokal yang ditentukan ke URL jarak jauh. Jika tidak ada bagian file di URL yang ditentukan, Curl akan menambahkan nama file lokal. CATATAN bahwa Anda harus menggunakan trailing / pada direktori terakhir untuk benar-benar membuktikan kepada Curl bahwa tidak ada nama file atau curl akan berpikir bahwa nama direktori terakhir Anda adalah nama file jarak jauh untuk digunakan. Itu kemungkinan besar akan menyebabkan operasi pengunggahan gagal. Jika ini digunakan pada server HTTP (S), perintah PUT akan digunakan.

Gunakan nama file "-" (tanda hubung tunggal) untuk menggunakan stdin alih-alih file yang diberikan. Sebagai alternatif, nama file "." (satu periode) dapat ditentukan sebagai ganti "-" untuk menggunakan stdin dalam mode non-blocking untuk memungkinkan membaca keluaran server saat stdin sedang diunggah.

Anda dapat menentukan satu -T untuk setiap URL di baris perintah. Setiap -T + pasangan URL menentukan apa yang akan diunggah dan ke mana. curl juga mendukung "globbing" dari argumen -T, yang berarti Anda dapat mengunggah banyak file ke satu URL dengan menggunakan gaya globbing URL yang sama yang didukung dalam URL, seperti ini:

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

atau bahkan

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

Ekspansi "* .txt" tidak berfungsi karena curl hanya mendukung sintaks yang sama dengan URL:

Anda dapat menentukan beberapa URL atau bagian dari URL dengan menulis set komponen dalam kurung kurawal seperti pada:

http: // situs . {satu, dua, tiga} .com

atau Anda bisa mendapatkan urutan seri alfanumerik dengan menggunakan [] seperti pada:

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

ftp://ftp.numericals.com/file[001-100[.txt (dengan nol di depan)

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

[...]

Saat menggunakan urutan [] atau {} ketika dipanggil dari prompt baris perintah, Anda mungkin harus memasukkan URL lengkap dalam tanda kutip ganda untuk menghindari shell mengganggu. Ini juga berlaku untuk karakter lain yang diperlakukan spesial, seperti misalnya '&', '?' dan '*'.

Tapi Anda bisa menggunakan shell "globbing" normal seperti ini:

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

(Contoh terakhir mungkin tidak berfungsi di semua shell atau dengan segala jenis nama file eksotis.)

rudimeier
sumber
$(perl -e 'print join(",",@ARGV)' *.txt)akan dengan benar menangani nama file dengan spasi.
ivan_pozdeev