Tải lên nhiều tệp qua FTP bằng cách sử dụng curl


14

Tôi đang cố tải lên tất cả các tệp văn bản trong thư mục hiện tại qua FTP đến một vị trí máy chủ bằng cách sử dụng curl. Tôi đã thử dòng sau:

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

Trong đó XXX là địa chỉ IP của máy chủ và YYY là tên người dùng và mật khẩu.

Tôi có thể chuyển file1.txt thành máy chủ thành công, nhưng nó phàn nàn về tệp thứ hai có nội dung 'Không thể mở' file_name '!'

Tôi đã trao đổi tên tệp và nó hoạt động cho file2.txt chứ không phải file1.txt. Có vẻ như tôi đã sai cú pháp, nhưng đây là những gì hướng dẫn sử dụng nói?

Ngoài ra, lý tưởng là tôi sẽ có thể làm một cái gì đó như thế này:

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

bởi vì tôi sẽ không luôn biết tên của các tệp txt trong thư mục hiện tại hoặc số lượng tệp sẽ được chuyển.

Tôi cho rằng tôi có thể phải viết một tập lệnh bash thu thập đầu ra của ls *.txtmột mảng và đưa nó vào định dạng nhiều tệp theo yêu cầu của curl.

Tôi chưa từng thực hiện bash scripting trước đây - đây có phải là cách đơn giản nhất để đạt được điều này?

Câu trả lời:


20

Lệnh đầu tiên của bạn sẽ hoạt động mà không có khoảng trắng:

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

Cũng lưu ý dấu "/" trong các URL ở trên.

Đây là mục nhập thủ công của curl về tùy chọn "-T":

-T, - tải tập tin

Thao tác này sẽ chuyển tệp cục bộ đã chỉ định sang URL từ xa. Nếu không có phần tệp trong URL được chỉ định, Curl sẽ nối thêm tên tệp cục bộ. LƯU Ý rằng bạn phải sử dụng dấu / trên thư mục cuối để thực sự chứng minh với Curl rằng không có tên tệp hoặc curl sẽ nghĩ rằng tên thư mục cuối cùng của bạn là tên tệp từ xa sẽ sử dụng. Điều đó rất có thể sẽ khiến hoạt động tải lên thất bại. Nếu điều này được sử dụng trên máy chủ HTTP (S), lệnh PUT sẽ được sử dụng.

Sử dụng tên tệp "-" (một dấu gạch ngang) để sử dụng stdin thay vì một tệp đã cho. Thay phiên, tên tệp "." (một khoảng thời gian duy nhất) có thể được chỉ định thay vì "-" để sử dụng stdin ở chế độ không chặn để cho phép đọc đầu ra của máy chủ trong khi stdin đang được tải lên.

Bạn có thể chỉ định một -T cho mỗi URL trên dòng lệnh. Mỗi cặp URL -T + chỉ định nội dung cần tải lên và đến đâu. curl cũng hỗ trợ "globalbing" của đối số -T, nghĩa là bạn có thể tải nhiều tệp lên một URL bằng cách sử dụng cùng một kiểu toàn cầu URL được hỗ trợ trong URL, như sau:

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

hoặc thậm chí

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

Mở rộng "* .txt" không hoạt động vì curl chỉ hỗ trợ cú pháp giống như đối với URL:

Bạn có thể chỉ định nhiều URL hoặc một phần của URL bằng cách viết bộ phần trong dấu ngoặc nhọn như trong:

http: // trang web . {một, hai, ba} .com

hoặc bạn có thể nhận được chuỗi các chuỗi chữ và số bằng cách sử dụng [] như trong:

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

ftp://ftp.numericals.com/file[001-100[.txt (với các số 0 đứng đầu)

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

[...]

Khi sử dụng các chuỗi [] hoặc {} khi được gọi từ dấu nhắc dòng lệnh, bạn có thể phải đặt URL đầy đủ trong dấu ngoặc kép để tránh trình bao can thiệp vào nó. Điều này cũng áp dụng cho các nhân vật khác được đối xử đặc biệt, ví dụ như '&', '?' và '*'.

Nhưng bạn có thể sử dụng lớp vỏ "bình thường" như thế này:

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

(Ví dụ cuối cùng có thể không hoạt động trong tất cả các shell hoặc với bất kỳ loại tên tệp kỳ lạ nào.)


$(perl -e 'print join(",",@ARGV)' *.txt)sẽ xử lý chính xác tên tệp có dấu cách.
ivan_pozdeev
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.