ฉันจะระบุว่า curl (ผ่านทางบรรทัดคำสั่ง) เขียนทับไฟล์ได้อย่างไรถ้ามันมีอยู่แล้ว?


11

ฉันใช้ curl ในไวยากรณ์นี้:

curl -o myfile.jpg http://mysite.com/myfile.jpg

หากฉันรันคำสั่งนี้สองครั้งฉันจะได้รับสองไฟล์:

myfile.jpg
myfile-1.jpg

ฉันจะบอก CURL ได้อย่างไรว่าฉันต้องการให้มันเขียนทับไฟล์หากมีอยู่?


6
ไม่สามารถทำซ้ำได้: curlเวอร์ชันใดของระบบใด
enzotib

คำตอบ:


22

ใช้:

curl http://mysite.com/myfile.jpg > myfile.jpg

2
และก่อนอื่นตรวจสอบให้แน่ใจว่าคุณไม่ได้noclobberเปิดใช้งานตัวเลือก ( set +o noclobber)
rozcietrzewiacz

0

ฉันพบปัญหาเดียวกันและฉันต้องการใช้ชื่อไฟล์เดิมซ้ำอีกครั้งไม่ว่าฝั่งเซิร์ฟเวอร์จะให้อะไรในกรณีของคุณคุณอาจได้รับชื่อไฟล์ด้วย basename

➸ basename 'http://mysite.com/myfile.jpg'
myfile.jpg

จากนั้นคุณสามารถเขียนฟังก์ชัน bash ของผู้ช่วยเช่น:

➸ function download { name="$(basename $1)"; curl "$1" > "$name"; }
➸ download 'http://mysite.com/myfile.jpg'

แต่ในกรณีของฉันชื่อไฟล์ไม่ได้เป็นส่วนหนึ่งของ URL มันมาพร้อมกับการจัดการเนื้อหา ด้วย curl บรรทัดคำสั่งคือ

$ curl -fSL -R -J -O 'http://some-site.com/getData.php?arg=1&arg2=...'

คุณอาจเพิกเฉย-fSLมันจัดการถ้าฝั่งเซิร์ฟเวอร์ให้เปลี่ยนเส้นทาง 302; -Rสำหรับเซิร์ฟเวอร์ด้านประทับเวลา-Jที่จะต้องพิจารณาด้านเซิร์ฟเวอร์Content-Dispositionและ-Oที่จะเปลี่ยนพฤติกรรมการดาวน์โหลดแทนการทุ่มตลาดใน terminal;

อย่างไรก็ตามยังคงมีความทุกข์ที่ไม่ยอมเขียนทับหากมีชื่อไฟล์อยู่ ฉันต้องการให้มันเขียนทับหากการLast-Modifiedประทับเวลาฝั่งเซิร์ฟเวอร์ใหม่กว่า;

จบลงด้วยโซลูชั่น wget ที่สามารถทำได้:

$ wget -NS --content-disposition 'http://some-site.com/getData.php?arg=1&arg2=...'

-Nคือการตรวจสอบเซิร์ฟเวอร์ tiemstamp ด้านข้างและเขียนทับเฉพาะเมื่อมีด้านเซิร์ฟเวอร์รุ่นใหม่; --content-dispositionคือการพิจารณาContent-Dispositionส่วนหัว; และพฤติกรรมเริ่มต้นของ wget คือการดาวน์โหลดไปยังชื่อไฟล์ที่กำหนดจากฝั่งเซิร์ฟเวอร์

ในกรณีของคุณถ้าคุณจะไม่สนใจการประทับเวลาก็แค่

$ wget -O myfile.jpg http://mysite.com/myfile.jpg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.