วิธีดาวน์โหลดไฟล์ด้วย curl

curl เป็นหนึ่งในเครื่องมือบรรทัดคำสั่งที่มีความสามารถหลากหลายที่สุดสำหรับการดาวน์โหลดไฟล์ผ่าน HTTP, HTTPS, FTP และโปรโตคอลอื่น ๆ อีกมากมาย ไม่ว่าคุณจะต้องการบันทึกการตอบกลับจาก API เป็นไฟล์หรือทำให้การดาวน์โหลดแบบแบตช์เป็นอัตโนมัติในเชลล์สคริปต์ curl มีแฟล็กที่ตอบโจทย์ คู่มือนี้ครอบคลุมทุกตัวเลือกที่เกี่ยวข้องกับการดาวน์โหลด — ตั้งแต่การบันทึกไฟล์ขั้นพื้นฐานด้วย -o และ -O ไปจนถึงการดาวน์โหลดต่อจากที่ค้างไว้ด้วย -C -, การจำกัดแบนด์วิดท์ด้วย --limit-rate และการแสดงแถบความคืบหน้า แต่ละแฟล็กมีคำอธิบายที่ชัดเจน รูปแบบการใช้งานทั่วไป และตัวอย่างพร้อมคัดลอก

ตารางอ้างอิงแฟล็กดาวน์โหลดฉบับย่อ

-o

เขียนผลลัพธ์ลงในไฟล์ที่ตั้งชื่อไว้แทน stdout

-O

เขียนผลลัพธ์ลงในไฟล์ที่มีชื่อเดียวกับไฟล์บนเซิร์ฟเวอร์

-L

ติดตามการเปลี่ยนเส้นทาง HTTP 3xx โดยอัตโนมัติ

-C -

ดำเนินการ/ดาวน์โหลดต่อจากการถ่ายโอนไฟล์ก่อนหน้า

--limit-rate

จำกัดความเร็วการถ่ายโอนตามอัตราที่กำหนด

--max-filesize

ปฏิเสธการดาวน์โหลดไฟล์ที่มีขนาดเกินกว่าที่ระบุ

-J

ใช้เฮดเดอร์ Content-Disposition เพื่อตั้งชื่อไฟล์

-#

แสดงความคืบหน้าการถ่ายโอนเป็นแถบความคืบหน้าแบบง่าย

-u

ระบุชื่อผู้ใช้:รหัสผ่านสำหรับการยืนยันตัวตนกับเซิร์ฟเวอร์

--retry

ลองถ่ายโอนซ้ำเมื่อเกิดข้อผิดพลาดชั่วคราว (จำนวนครั้ง)

--retry-delay

รอจำนวนวินาทีที่ระบุระหว่างการลองซ้ำ

-T

อัปโหลดไฟล์ในเครื่องไปยัง URL (ใช้ PUT เป็นค่าเริ่มต้น)

--create-dirs

สร้างไดเรกทอรีในเครื่องตามต้องการเมื่อบันทึกผลลัพธ์

-s

ซ่อนมิเตอร์ความคืบหน้าและข้อความข้อผิดพลาด

--output-dir

บันทึกไฟล์ผลลัพธ์ในไดเรกทอรีที่ระบุ (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.pdf

curl -O: บันทึกด้วยชื่อไฟล์จากเซิร์ฟเวอร์

ทำหน้าที่อะไร
แฟล็ก -O (หรือ --remote-name) บันทึกไฟล์ที่ดาวน์โหลดโดยใช้ชื่อไฟล์ที่ดึงมาจาก URL ตัวอย่างเช่น หาก URL ลงท้ายด้วย /data.csv curl จะสร้างไฟล์ชื่อ data.csv ในไดเรกทอรีปัจจุบัน
การใช้งานทั่วไป
ใช้ -O เมื่อชื่อไฟล์บนเซิร์ฟเวอร์มีความหมายและคุณไม่จำเป็นต้องเปลี่ยนชื่อ คุณสามารถใส่แฟล็ก -O หลายตัวเพื่อดาวน์โหลดหลายไฟล์ในคำสั่งเดียว หมายเหตุ: หาก URL ไม่มีชื่อไฟล์ (เช่น ลงท้ายด้วย /) curl จะล้มเหลว — ใช้ -o แทน
$ curl -O https://example.com/files/data.csv

curl -L: ติดตามการเปลี่ยนเส้นทาง

ทำหน้าที่อะไร
แฟล็ก -L (หรือ --location) ทำให้ curl ติดตามการเปลี่ยนเส้นทาง HTTP โดยอัตโนมัติ — 301 (ย้ายถาวร), 302 (พบ), 307 และ 308 หากไม่มี -L curl จะส่งคืนการตอบกลับการเปลี่ยนเส้นทางแทนเนื้อหาจริง
การใช้งานทั่วไป
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.gz

curl -C -: ดาวน์โหลดต่อจากที่ค้างไว้

ทำหน้าที่อะไร
แฟล็ก -C - (หรือ --continue-at -) บอกให้ curl ตรวจจับขนาดของไฟล์บางส่วนที่มีอยู่โดยอัตโนมัติและดาวน์โหลดต่อจากจุดที่หยุดไว้ เซิร์ฟเวอร์ต้องรองรับเฮดเดอร์ HTTP Range จึงจะใช้งานได้
การใช้งานทั่วไป
หากการดาวน์โหลดขนาดใหญ่ถูกขัดจังหวะจากปัญหาเครือข่ายหรือหมดเวลา เพียงรันคำสั่งเดิมอีกครั้งโดยเพิ่ม -C - curl จะส่งเฮดเดอร์ Range: bytes=OFFSET- และดาวน์โหลดเฉพาะข้อมูลที่เหลือ สิ่งนี้จำเป็นสำหรับไฟล์ขนาดใหญ่ผ่านการเชื่อมต่อที่ไม่เสถียร
$ curl -C - -o largefile.zip https://cdn.example.com/largefile.zip

curl --limit-rate: จำกัดความเร็วดาวน์โหลด

ทำหน้าที่อะไร
แฟล็ก --limit-rate จำกัดความเร็วดาวน์โหลด (และอัปโหลด) ตามอัตราที่กำหนด รองรับส่วนต่อท้าย: k หรือ K สำหรับกิโลไบต์/วินาที, m หรือ M สำหรับเมกะไบต์/วินาที, g หรือ G สำหรับกิกะไบต์/วินาที
การใช้งานทั่วไป
ใช้ --limit-rate เพื่อหลีกเลี่ยงการใช้แบนด์วิดท์เต็มเมื่อดาวน์โหลดไฟล์ขนาดใหญ่ โดยเฉพาะบนการเชื่อมต่อที่ใช้ร่วมกัน ยังเป็นประโยชน์สำหรับการทดสอบว่าแอปพลิเคชันของคุณจัดการกับการตอบกลับที่ช้าอย่างไร
$ curl --limit-rate 1M -o bigfile.iso https://mirror.example.com/bigfile.iso

curl --max-filesize: ยกเลิกหากไฟล์ใหญ่เกินไป

ทำหน้าที่อะไร
แฟล็ก --max-filesize บอกให้ curl ยกเลิกการถ่ายโอนหากขนาดไฟล์ที่คาดว่าจะได้ (จากเฮดเดอร์ Content-Length) เกินขีดจำกัดที่ระบุ ขนาดสามารถใช้ส่วนต่อท้ายเช่น k, M, G
การใช้งานทั่วไป
ใช้ในสคริปต์เพื่อป้องกันไม่ให้การดาวน์โหลดขนาดใหญ่ที่ไม่คาดคิดกินพื้นที่ดิสก์ โปรดทราบว่าไม่ใช่ทุกเซิร์ฟเวอร์จะส่ง Content-Length — ในกรณีนั้น curl ไม่สามารถบังคับใช้ขีดจำกัดนี้ได้และการดาวน์โหลดจะดำเนินต่อไปตามปกติ
$ curl --max-filesize 100M -o update.bin https://example.com/update.bin

curl -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=csv

curl -#: แสดงแถบความคืบหน้า

ทำหน้าที่อะไร
แฟล็ก -# (หรือ --progress-bar) แทนที่มิเตอร์ความคืบหน้าแบบละเอียดเริ่มต้นด้วยแถบความคืบหน้า ### แบบง่าย อ่านง่ายกว่าสำหรับการใช้งานแบบโต้ตอบ
การใช้งานทั่วไป
ใช้ -# เมื่อดาวน์โหลดแบบโต้ตอบและต้องการตัวแสดงความคืบหน้าที่สะอาด สำหรับสคริปต์ ให้ใช้ -s (เงียบ) หรือมิเตอร์ความคืบหน้าเริ่มต้น ผลลัพธ์เริ่มต้นของ curl แสดงความเร็ว เปอร์เซ็นต์ เวลาที่เหลือ และขนาดรวมอยู่แล้ว
$ curl -# -o archive.tar.gz https://example.com/archive.tar.gz

ตัวเลือกการดาวน์โหลดเพิ่มเติม

-u

ระบุชื่อผู้ใช้:รหัสผ่านสำหรับการยืนยันตัวตนกับเซิร์ฟเวอร์

--retry

ลองถ่ายโอนซ้ำเมื่อเกิดข้อผิดพลาดชั่วคราว (จำนวนครั้ง)

--retry-delay

รอจำนวนวินาทีที่ระบุระหว่างการลองซ้ำ

-T

อัปโหลดไฟล์ในเครื่องไปยัง URL (ใช้ PUT เป็นค่าเริ่มต้น)

--create-dirs

สร้างไดเรกทอรีในเครื่องตามต้องการเมื่อบันทึกผลลัพธ์

-s

ซ่อนมิเตอร์ความคืบหน้าและข้อความข้อผิดพลาด

--output-dir

บันทึกไฟล์ผลลัพธ์ในไดเรกทอรีที่ระบุ (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