วิธีดาวน์โหลดไฟล์ด้วย curl
curl เป็นหนึ่งในเครื่องมือบรรทัดคำสั่งที่มีความสามารถหลากหลายที่สุดสำหรับการดาวน์โหลดไฟล์ผ่าน HTTP, HTTPS, FTP และโปรโตคอลอื่น ๆ อีกมากมาย ไม่ว่าคุณจะต้องการบันทึกการตอบกลับจาก API เป็นไฟล์หรือทำให้การดาวน์โหลดแบบแบตช์เป็นอัตโนมัติในเชลล์สคริปต์ curl มีแฟล็กที่ตอบโจทย์ คู่มือนี้ครอบคลุมทุกตัวเลือกที่เกี่ยวข้องกับการดาวน์โหลด — ตั้งแต่การบันทึกไฟล์ขั้นพื้นฐานด้วย -o และ -O ไปจนถึงการดาวน์โหลดต่อจากที่ค้างไว้ด้วย -C -, การจำกัดแบนด์วิดท์ด้วย --limit-rate และการแสดงแถบความคืบหน้า แต่ละแฟล็กมีคำอธิบายที่ชัดเจน รูปแบบการใช้งานทั่วไป และตัวอย่างพร้อมคัดลอก
ตารางอ้างอิงแฟล็กดาวน์โหลดฉบับย่อ
เขียนผลลัพธ์ลงในไฟล์ที่ตั้งชื่อไว้แทน stdout
เขียนผลลัพธ์ลงในไฟล์ที่มีชื่อเดียวกับไฟล์บนเซิร์ฟเวอร์
ติดตามการเปลี่ยนเส้นทาง HTTP 3xx โดยอัตโนมัติ
ดำเนินการ/ดาวน์โหลดต่อจากการถ่ายโอนไฟล์ก่อนหน้า
จำกัดความเร็วการถ่ายโอนตามอัตราที่กำหนด
ปฏิเสธการดาวน์โหลดไฟล์ที่มีขนาดเกินกว่าที่ระบุ
ใช้เฮดเดอร์ Content-Disposition เพื่อตั้งชื่อไฟล์
แสดงความคืบหน้าการถ่ายโอนเป็นแถบความคืบหน้าแบบง่าย
ระบุชื่อผู้ใช้:รหัสผ่านสำหรับการยืนยันตัวตนกับเซิร์ฟเวอร์
ลองถ่ายโอนซ้ำเมื่อเกิดข้อผิดพลาดชั่วคราว (จำนวนครั้ง)
รอจำนวนวินาทีที่ระบุระหว่างการลองซ้ำ
อัปโหลดไฟล์ในเครื่องไปยัง URL (ใช้ PUT เป็นค่าเริ่มต้น)
สร้างไดเรกทอรีในเครื่องตามต้องการเมื่อบันทึกผลลัพธ์
ซ่อนมิเตอร์ความคืบหน้าและข้อความข้อผิดพลาด
บันทึกไฟล์ผลลัพธ์ในไดเรกทอรีที่ระบุ (curl 7.73+)
curl -o: บันทึกเป็นชื่อไฟล์ที่ระบุ
- ทำหน้าที่อะไร
- แฟล็ก
-o(หรือ--output) บอกให้ curl บันทึกเนื้อหาการตอบกลับลงในไฟล์ที่คุณระบุ หากไม่มีแฟล็กนี้ curl จะแสดงผลลัพธ์ออกทาง stdout (เทอร์มินัลของคุณ) คุณสามารถใช้ชื่อไฟล์และพาธใดก็ได้ — curl จะสร้างไฟล์หรือเขียนทับไฟล์ที่มีอยู่ - การใช้งานทั่วไป
- ใช้
-oเมื่อคุณต้องการควบคุมชื่อไฟล์ที่แน่นอนหรือบันทึกลงในไดเรกทอรีที่ระบุ ใช้งานได้กับทุกโปรโตคอล — HTTP, HTTPS, FTP, SFTP และอื่น ๆ ใช้ร่วมกับ-Lเพื่อจัดการการเปลี่ยนเส้นทางและ-sสำหรับโหมดเงียบในสคริปต์
$ curl -o report.pdf https://example.com/files/report.pdfcurl -O: บันทึกด้วยชื่อไฟล์จากเซิร์ฟเวอร์
- ทำหน้าที่อะไร
- แฟล็ก
-O(หรือ--remote-name) บันทึกไฟล์ที่ดาวน์โหลดโดยใช้ชื่อไฟล์ที่ดึงมาจาก URL ตัวอย่างเช่น หาก URL ลงท้ายด้วย/data.csvcurl จะสร้างไฟล์ชื่อdata.csvในไดเรกทอรีปัจจุบัน - การใช้งานทั่วไป
- ใช้
-Oเมื่อชื่อไฟล์บนเซิร์ฟเวอร์มีความหมายและคุณไม่จำเป็นต้องเปลี่ยนชื่อ คุณสามารถใส่แฟล็ก-Oหลายตัวเพื่อดาวน์โหลดหลายไฟล์ในคำสั่งเดียว หมายเหตุ: หาก URL ไม่มีชื่อไฟล์ (เช่น ลงท้ายด้วย/) curl จะล้มเหลว — ใช้-oแทน
$ curl -O https://example.com/files/data.csvcurl -L: ติดตามการเปลี่ยนเส้นทาง
- ทำหน้าที่อะไร
- แฟล็ก
-L(หรือ--location) ทำให้ curl ติดตามการเปลี่ยนเส้นทาง HTTP โดยอัตโนมัติ — 301 (ย้ายถาวร), 302 (พบ), 307 และ 308 หากไม่มี-Lcurl จะส่งคืนการตอบกลับการเปลี่ยนเส้นทางแทนเนื้อหาจริง - การใช้งานทั่วไป
- URL สำหรับดาวน์โหลดส่วนใหญ่จะเปลี่ยนเส้นทางอย่างน้อยหนึ่งครั้ง (เช่น จาก HTTP เป็น HTTPS หรือจาก URL สั้นไปยังไฟล์จริง) ควรใช้
-Lร่วมกับ-oหรือ-Oเสมอเมื่อดาวน์โหลดไฟล์ โดยค่าเริ่มต้น curl จะติดตามการเปลี่ยนเส้นทางสูงสุด 50 ครั้ง; เปลี่ยนค่านี้ด้วย--max-redirs
$ curl -L -o latest.tar.gz https://github.com/user/repo/releases/latest/download/app.tar.gzcurl -C -: ดาวน์โหลดต่อจากที่ค้างไว้
- ทำหน้าที่อะไร
- แฟล็ก
-C -(หรือ--continue-at -) บอกให้ curl ตรวจจับขนาดของไฟล์บางส่วนที่มีอยู่โดยอัตโนมัติและดาวน์โหลดต่อจากจุดที่หยุดไว้ เซิร์ฟเวอร์ต้องรองรับเฮดเดอร์ HTTPRangeจึงจะใช้งานได้ - การใช้งานทั่วไป
- หากการดาวน์โหลดขนาดใหญ่ถูกขัดจังหวะจากปัญหาเครือข่ายหรือหมดเวลา เพียงรันคำสั่งเดิมอีกครั้งโดยเพิ่ม
-C -curl จะส่งเฮดเดอร์Range: bytes=OFFSET-และดาวน์โหลดเฉพาะข้อมูลที่เหลือ สิ่งนี้จำเป็นสำหรับไฟล์ขนาดใหญ่ผ่านการเชื่อมต่อที่ไม่เสถียร
$ curl -C - -o largefile.zip https://cdn.example.com/largefile.zipcurl --limit-rate: จำกัดความเร็วดาวน์โหลด
- ทำหน้าที่อะไร
- แฟล็ก
--limit-rateจำกัดความเร็วดาวน์โหลด (และอัปโหลด) ตามอัตราที่กำหนด รองรับส่วนต่อท้าย:kหรือKสำหรับกิโลไบต์/วินาที,mหรือMสำหรับเมกะไบต์/วินาที,gหรือGสำหรับกิกะไบต์/วินาที - การใช้งานทั่วไป
- ใช้
--limit-rateเพื่อหลีกเลี่ยงการใช้แบนด์วิดท์เต็มเมื่อดาวน์โหลดไฟล์ขนาดใหญ่ โดยเฉพาะบนการเชื่อมต่อที่ใช้ร่วมกัน ยังเป็นประโยชน์สำหรับการทดสอบว่าแอปพลิเคชันของคุณจัดการกับการตอบกลับที่ช้าอย่างไร
$ curl --limit-rate 1M -o bigfile.iso https://mirror.example.com/bigfile.isocurl --max-filesize: ยกเลิกหากไฟล์ใหญ่เกินไป
- ทำหน้าที่อะไร
- แฟล็ก
--max-filesizeบอกให้ curl ยกเลิกการถ่ายโอนหากขนาดไฟล์ที่คาดว่าจะได้ (จากเฮดเดอร์Content-Length) เกินขีดจำกัดที่ระบุ ขนาดสามารถใช้ส่วนต่อท้ายเช่นk,M,G - การใช้งานทั่วไป
- ใช้ในสคริปต์เพื่อป้องกันไม่ให้การดาวน์โหลดขนาดใหญ่ที่ไม่คาดคิดกินพื้นที่ดิสก์ โปรดทราบว่าไม่ใช่ทุกเซิร์ฟเวอร์จะส่ง
Content-Length— ในกรณีนั้น curl ไม่สามารถบังคับใช้ขีดจำกัดนี้ได้และการดาวน์โหลดจะดำเนินต่อไปตามปกติ
$ curl --max-filesize 100M -o update.bin https://example.com/update.bincurl -J: ใช้ชื่อไฟล์ที่เซิร์ฟเวอร์แนะนำ
- ทำหน้าที่อะไร
- แฟล็ก
-J(หรือ--remote-header-name) บอกให้ curl ใช้ชื่อไฟล์ที่ระบุในเฮดเดอร์Content-Dispositionของเซิร์ฟเวอร์แทนการดึงจาก URL พบได้ทั่วไปสำหรับ API ดาวน์โหลดที่ส่งคืนไฟล์ที่มีชื่อที่มีความหมาย - การใช้งานทั่วไป
- ควรใช้
-Jร่วมกับ-Oเสมอ สิ่งนี้มีประโยชน์เมื่อ URL เป็น API endpoint (เช่น/export?format=csv) แต่เซิร์ฟเวอร์ส่งคืนชื่อไฟล์ที่เหมาะสมในเฮดเดอร์ หมายเหตุด้านความปลอดภัย: เซิร์ฟเวอร์ควบคุมชื่อไฟล์ ดังนั้นใช้เฉพาะกับเซิร์ฟเวอร์ที่เชื่อถือได้เท่านั้น
$ curl -L -O -J https://example.com/api/export?format=csvcurl -#: แสดงแถบความคืบหน้า
- ทำหน้าที่อะไร
- แฟล็ก
-#(หรือ--progress-bar) แทนที่มิเตอร์ความคืบหน้าแบบละเอียดเริ่มต้นด้วยแถบความคืบหน้า###แบบง่าย อ่านง่ายกว่าสำหรับการใช้งานแบบโต้ตอบ - การใช้งานทั่วไป
- ใช้
-#เมื่อดาวน์โหลดแบบโต้ตอบและต้องการตัวแสดงความคืบหน้าที่สะอาด สำหรับสคริปต์ ให้ใช้-s(เงียบ) หรือมิเตอร์ความคืบหน้าเริ่มต้น ผลลัพธ์เริ่มต้นของ curl แสดงความเร็ว เปอร์เซ็นต์ เวลาที่เหลือ และขนาดรวมอยู่แล้ว
$ curl -# -o archive.tar.gz https://example.com/archive.tar.gzตัวเลือกการดาวน์โหลดเพิ่มเติม
ระบุชื่อผู้ใช้:รหัสผ่านสำหรับการยืนยันตัวตนกับเซิร์ฟเวอร์
ลองถ่ายโอนซ้ำเมื่อเกิดข้อผิดพลาดชั่วคราว (จำนวนครั้ง)
รอจำนวนวินาทีที่ระบุระหว่างการลองซ้ำ
อัปโหลดไฟล์ในเครื่องไปยัง URL (ใช้ PUT เป็นค่าเริ่มต้น)
สร้างไดเรกทอรีในเครื่องตามต้องการเมื่อบันทึกผลลัพธ์
ซ่อนมิเตอร์ความคืบหน้าและข้อความข้อผิดพลาด
บันทึกไฟล์ผลลัพธ์ในไดเรกทอรีที่ระบุ (curl 7.73+)
สถานการณ์การดาวน์โหลดในโลกจริง
ตัวอย่างเหล่านี้ใช้แฟล็กหลายตัวร่วมกันเพื่อจัดการงานดาวน์โหลดทั่วไปที่คุณจะพบในการพัฒนาและการเขียนสคริปต์ประจำวัน
ดาวน์โหลดหลายไฟล์พร้อมกัน
ใช้แฟล็ก -O หลายตัวเพื่อดาวน์โหลดหลายไฟล์ในคำสั่งเดียว curl ประมวลผลตามลำดับ สำหรับการดาวน์โหลดแบบขนาน ใช้ xargs หรือ GNU parallel
$ curl -O https://example.com/file1.txt -O https://example.com/file2.txt -O https://example.com/file3.txtดาวน์โหลดจากเซิร์ฟเวอร์ FTP
curl รองรับ FTP, FTPS และ SFTP ในตัว เพิ่ม -u user:password สำหรับการเข้าถึงที่ต้องยืนยันตัวตน ใช้ -O เพื่อเก็บชื่อไฟล์จากเซิร์ฟเวอร์
$ curl -u user:pass -o backup.sql ftp://ftp.example.com/db/backup.sqlดาวน์โหลดพร้อมการยืนยันตัวตน
ใช้ -u user:pass สำหรับ Basic Auth หรือ -H เพื่อส่ง Bearer token หรือ API key ใช้ร่วมกับ -L และ -o สำหรับการดาวน์โหลดที่สมบูรณ์
$ curl -H "Authorization: Bearer eyJhbGciOi..." -L -o data.json https://api.example.com/exportการดาวน์โหลดที่เชื่อถือได้พร้อมการดาวน์โหลดต่อและลองซ้ำ
ใช้ -C - (ดาวน์โหลดต่อ), --retry (ลองซ้ำอัตโนมัติเมื่อล้มเหลว) และ -L (ติดตามการเปลี่ยนเส้นทาง) ร่วมกันสำหรับการดาวน์โหลดที่แข็งแกร่งที่ทนต่อการขัดจังหวะของเครือข่าย
$ curl -C - --retry 5 --retry-delay 10 -L -o largefile.zip https://cdn.example.com/largefile.zipคำถามที่พบบ่อยเกี่ยวกับการดาวน์โหลดด้วย curl
ความแตกต่างระหว่าง curl -o กับ curl -O คืออะไร?
-o filename บันทึกการดาวน์โหลดเป็นชื่อไฟล์ที่คุณระบุ -O ดึงชื่อไฟล์จาก URL และใช้ชื่อนั้น ใช้ -o เมื่อต้องการชื่อหรือพาธที่กำหนดเอง; ใช้ -O เมื่อชื่อไฟล์จากเซิร์ฟเวอร์ใช้ได้ตามที่เป็น
ทำไม curl ดาวน์โหลดไฟล์ว่างหรือไฟล์ HTML แทนไฟล์จริง?
URL อาจส่งคืนการเปลี่ยนเส้นทาง HTTP (301 หรือ 302) โดยค่าเริ่มต้น curl จะบันทึกการตอบกลับการเปลี่ยนเส้นทาง — ไม่ใช่เนื้อหาสุดท้าย เพิ่ม -L เพื่อติดตามการเปลี่ยนเส้นทางโดยอัตโนมัติ: curl -L -o file URL
ฉันจะดาวน์โหลดไฟล์ที่ดาวน์โหลดไม่เสร็จต่อด้วย curl ได้อย่างไร?
ใช้ curl -C - -o filename URL แฟล็ก -C - ตรวจจับขนาดไฟล์ที่มีอยู่และส่งเฮดเดอร์ Range เพื่อขอเฉพาะไบต์ที่เหลือ เซิร์ฟเวอร์ต้องรองรับ range requests จึงจะใช้งานได้
ฉันจะจำกัดความเร็วดาวน์โหลดใน curl ได้อย่างไร?
ใช้ --limit-rate พร้อมค่าและส่วนต่อท้าย: curl --limit-rate 500k -o file URL จำกัดความเร็วที่ 500 KB/s ส่วนต่อท้าย: k (KB/s), M (MB/s), G (GB/s)
curl สามารถดาวน์โหลดหลายไฟล์พร้อมกันได้หรือไม่?
ได้ ใช้แฟล็ก -O หลายตัว: curl -O URL1 -O URL2 -O URL3 curl จะดาวน์โหลดตามลำดับ สำหรับการดาวน์โหลดแบบขนาน ส่งรายการ URL ไปที่ xargs -P 4 -I {} curl -O {}
ฉันจะดาวน์โหลดไฟล์ที่ต้องการการยืนยันตัวตนได้อย่างไร?
สำหรับ HTTP Basic Auth: curl -u user:pass -o file URL สำหรับ Bearer token: curl -H "Authorization: Bearer TOKEN" -o file URL สำหรับ API key ในเฮดเดอร์: curl -H "X-API-Key: KEY" -o file URL
ฉันจะดาวน์โหลดไฟล์จากเซิร์ฟเวอร์ FTP ด้วย curl ได้อย่างไร?
ใช้ curl -u user:pass -o localfile ftp://host/path/file curl รองรับ FTP, FTPS (FTP ผ่าน TLS) และ SFTP (SSH FTP) ในตัว สำหรับ FTP แบบไม่ระบุตัวตน ไม่ต้องใส่ -u
ฉันจะดาวน์โหลดไฟล์ขนาดใหญ่อย่างน่าเชื่อถือด้วย curl ได้อย่างไร?
ใช้ -C - (ดาวน์โหลดต่อเมื่อล้มเหลว), --retry 5 (ลองซ้ำอัตโนมัติ), --retry-delay 10 และ -L (ติดตามการเปลี่ยนเส้นทาง) ร่วมกัน: curl -C - --retry 5 --retry-delay 10 -L -o file URL สิ่งนี้จัดการปัญหาเครือข่ายโดยอัตโนมัติ
ฉันจะแสดงแถบความคืบหน้าเมื่อดาวน์โหลดด้วย curl ได้อย่างไร?
ใช้ curl -# -o file URL สำหรับแถบความคืบหน้าแบบง่าย ผลลัพธ์เริ่มต้นของ curl แสดงความเร็วการถ่ายโอน เปอร์เซ็นต์ และเวลาโดยประมาณอยู่แล้ว สำหรับสคริปต์ ใช้ -s เพื่อซ่อนผลลัพธ์ทั้งหมด
ฉันสามารถระบุไดเรกทอรีดาวน์โหลดใน curl ได้หรือไม่?
ด้วย curl 7.73+ ใช้ --output-dir /path/to/dir ร่วมกับ -O สำหรับเวอร์ชันเก่ากว่า ระบุพาธเต็มด้วย -o /path/to/dir/filename เพิ่ม --create-dirs หากไดเรกทอรียังไม่มี
ฉันควรใช้ curl หรือ wget สำหรับการดาวน์โหลดไฟล์?
ทั้งสองยอดเยี่ยม wget ง่ายกว่าสำหรับการทำสำเนาเว็บไซต์แบบเรียกซ้ำและมีตรรกะลองซ้ำในตัว curl รองรับ 25+ โปรโตคอล (ไม่ใช่แค่ HTTP/FTP) ดีกว่าสำหรับการเรียก API และการเขียนสคริปต์ รองรับวิธีการยืนยันตัวตนมากกว่า และพร้อมใช้งานบนระบบปฏิบัติการแทบทุกระบบ
ฉันจะใช้ curl ในสคริปต์ bash เพื่อดาวน์โหลดไฟล์ได้อย่างไร?
ใช้ curl -fsSL -o file URL: -f ล้มเหลวแบบเงียบเมื่อเกิดข้อผิดพลาด HTTP (ไม่บันทึกหน้าข้อผิดพลาด), -s เงียบ, -S แสดงข้อผิดพลาดแม้ในโหมดเงียบ, -L ติดตามการเปลี่ยนเส้นทาง ตรวจสอบรหัสออก: if ! curl -fsSL -o file URL; then echo "Download failed"; exit 1; fi