การอัปโหลดหลายไฟล์ผ่าน FTP โดยใช้ curl


14

ฉันกำลังพยายามอัพโหลดไฟล์ข้อความทั้งหมดภายในโฟลเดอร์ปัจจุบันผ่าน FTP ไปยังตำแหน่งเซิร์ฟเวอร์โดยใช้ curl ฉันลองบรรทัดต่อไปนี้:

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

โดยที่ XXX คือที่อยู่ IP ของเซิร์ฟเวอร์และ YYY เป็นชื่อผู้ใช้และรหัสผ่าน

ฉันสามารถถ่ายโอน file1.txt ไปยังเซิร์ฟเวอร์ได้สำเร็จ แต่มันบ่นเกี่ยวกับไฟล์ที่สองว่า 'ไม่สามารถเปิด' file_name '!'

ฉันสลับชื่อไฟล์และทำงานกับ file2.txt ไม่ใช่ file1.txt ดูเหมือนว่าฉันผิดไวยากรณ์ แต่นี่คือสิ่งที่คู่มือพูด?

นอกจากนี้ฉันควรจะทำสิ่งนี้:

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

เพราะฉันจะไม่รู้จักชื่อของไฟล์ txt ในโฟลเดอร์ปัจจุบันหรือจำนวนไฟล์ที่จะถ่ายโอนเสมอ

ฉันคิดว่าฉันอาจต้องเขียนสคริปต์ทุบตีที่รวบรวมเอาท์พุทของls *.txtลงในอาเรย์และวางลงในรูปแบบไฟล์หลายไฟล์ที่ต้องการโดย curl

ฉันไม่ได้ทำสคริปต์ทุบตีมาก่อน - นี่เป็นวิธีที่ง่ายที่สุดในการบรรลุเป้าหมายนี้หรือไม่?

คำตอบ:


20

คำสั่งแรกของคุณควรทำงานโดยไม่มีช่องว่าง:

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

ให้สังเกตการต่อท้าย "/" ใน URL ด้านบนด้วย

นี่คือรายการคู่มือของ curl เกี่ยวกับตัวเลือก "-T":

-T, - อัปโหลดไฟล์

สิ่งนี้ถ่ายโอนไฟล์โลคัลที่ระบุไปยังรีโมต URL หากไม่มีส่วนของไฟล์ใน URL ที่ระบุ Curl จะต่อท้ายชื่อไฟล์ในเครื่อง โปรดทราบว่าคุณต้องใช้การต่อท้าย / บนไดเรกทอรีสุดท้ายเพื่อพิสูจน์ Curl ว่าไม่มีชื่อไฟล์หรือ curl จะคิดว่าชื่อไดเรกทอรีสุดท้ายของคุณคือชื่อไฟล์ระยะไกลที่จะใช้ ซึ่งน่าจะทำให้การอัปโหลดล้มเหลว หากใช้บนเซิร์ฟเวอร์ HTTP (S) คำสั่ง PUT จะถูกใช้

ใช้ชื่อไฟล์ "-" (เส้นประเดียว) เพื่อใช้ stdin แทนไฟล์ที่กำหนด อีกวิธีหนึ่งชื่อไฟล์ "." (ช่วงเวลาเดียว) อาจถูกระบุแทน "-" เพื่อใช้ stdin ในโหมดที่ไม่ปิดกั้นเพื่ออนุญาตเอาต์พุตเซิร์ฟเวอร์การอ่านขณะที่ stdin กำลังถูกอัปโหลด

คุณสามารถระบุหนึ่ง -T สำหรับแต่ละ URL ในบรรทัดคำสั่ง คู่ -T + URL ระบุว่าจะอัปโหลดและไปยังที่ใด curl ยังรองรับ "globbing" ของอาร์กิวเมนต์ -T ซึ่งหมายความว่าคุณสามารถอัปโหลดไฟล์หลายไฟล์ไปยัง URL เดียวโดยใช้สไตล์ globbing URL เดียวกันที่สนับสนุนใน URL ดังนี้:

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

หรือแม้กระทั่ง

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

การขยาย "* .txt" ไม่ทำงานเพราะ curl รองรับไวยากรณ์เดียวกับ URL:

คุณสามารถระบุหลาย ๆ URL หรือบางส่วนของ URL โดยการเขียนชุดชิ้นส่วนภายในวงเล็บปีกกาดังต่อไปนี้:

http: // site . {หนึ่ง, สอง, สาม} .com

หรือคุณสามารถหาลำดับของชุดตัวอักษรและตัวเลขโดยใช้ [] ใน:

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

ftp://ftp.numericals.com/fileuty001-100 Same.txt (พร้อมเลขศูนย์นำหน้า)

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

[ ... ]

เมื่อใช้ลำดับ [] หรือ {} เมื่อเรียกใช้จากพรอมต์บรรทัดคำสั่งคุณอาจต้องใส่ URL แบบเต็มในเครื่องหมายคำพูดคู่เพื่อหลีกเลี่ยงเชลล์จากการแทรกแซง สิ่งนี้จะไปสำหรับตัวละครอื่น ๆ ที่ได้รับการดูแลเป็นพิเศษเช่น '&', '?' และ '*'

แต่คุณสามารถใช้เปลือก "ปกติ" กลมแบบนี้:

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

(ตัวอย่างสุดท้ายอาจใช้ไม่ได้กับเชลล์ทั้งหมดหรือชื่อไฟล์แปลก ๆ )


$(perl -e 'print join(",",@ARGV)' *.txt)จะจัดการชื่อไฟล์ด้วยช่องว่างได้อย่างถูกต้อง
ivan_pozdeev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.