Bisakah saya berhenti membuat duplikat?

13

Jika saya menjalankan wget dua kali, ia tidak mengenali bahwa ia telah mengunduh file itu, dan membuat yang baru. Apakah ada cara untuk mencegahnya mengunduh file lagi?

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png.1’
...

(Senang menggunakan ikal atau alternatif skrip serupa jika wget tidak bisa melakukan ini.)

david.libremone
sumber
9
Yah itu membuat yang baru karena TIDAK mengenali file yang ada!
nico

Jawaban:

17

Saya sarankan Anda menggunakan -Nopsi.

-N
--timestamping
    Turn on time-stamping.

Ini memungkinkan time-stamping, yang mengunduh ulang file hanya jika lebih baru di server daripada versi yang diunduh.

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Server file no newer than local file ‘logo.png’ -- not retrieving.

Peringatan (dari komentar KasiyA)

Jika server tidak dikonfigurasi dengan benar, itu mungkin selalu melaporkan bahwa file tersebut baru dan -Nakan selalu mengunduh ulang file. Dalam hal ini, -ncmungkin merupakan opsi yang lebih baik.

Jofel
sumber
3
Ketika server tidak dikonfigurasi dengan benar -Ndapat gagal dan wget akan selalu mengunduh ulang. Jadi terkadang -nclebih baik daripada-N
αғsнιη
1
@Kasiy terima kasih atas komentar Anda, sepertinya tidak ada pilihan yang baik untuk semua kasus.
jofel
16

Ya itu -cpilihan.

--continue
    Continue getting a partially-downloaded file.  This is useful when you want to
    finish up a download started by a previous instance of Wget, or by another
    program.

Jika file sama, upaya unduhan kedua akan berhenti.

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
The file is already fully retrieved; nothing to do.

Peringatan (dari komentar jofel)

Jika file telah berubah di server, -copsi dapat memberikan hasil yang salah.

Dengan -c, wget hanya meminta server untuk data di luar bagian file yang sudah diunduh, tidak ada yang lain. Itu tidak memeriksa apakah ada perubahan pada bagian file yang sudah diunduh. Dengan demikian, Anda bisa file yang rusak yang merupakan campuran dari file lama dan baru.


Tes lokal

Anda dapat mengujinya dengan menjalankan server web lokal sederhana sebagai berikut (Terima kasih atas jawaban @roadmr ):

Buka jendela Terminal dan ketik:

cd /path/to/parent-download-dir/
python -m SimpleHTTPServer

Sekarang buka Terminal lain dan lakukan:

wget -c http://localhost:8000/filename-to-download

Perhatikan bahwa itu filename-to-downloadadalah file yang terletak di /path/to/parent-download-dir/mana kita ingin mengunduhnya.

Sekarang jika Anda menjalankan perintah wget beberapa kali, Anda akan melihat:

The file is already fully retrieved; nothing to do.

Oke, sekarang buka /path/to/parent-download-dir/direktori dan tambahkan sesuatu ke file sumber, misalnya jika itu adalah file teks, tambahkan baris tambahan sederhana di dalamnya dan simpan file tersebut. Sekarang coba dengan wget -c .... Hebat, sekarang Anda akan melihat file tersebut diunduh lagi tetapi Anda telah mengunduhnya sebelumnya.

Alasan: mengapa mengunduh ulang?

karena ukurannya berubah menjadi ukuran yang lebih besar daripada file yang diunduh lama dan tidak ada yang lain.

αғsнιη
sumber
1
Ini tidak berfungsi dengan benar jika file telah berubah di server di antara unduhan. Dalam kasus terburuk (ukuran file meningkat), Anda mendapatkan file yang rusak.
jofel
1
@ jofel ya -nctidak seperti yang Anda katakan tetapi -copsi akan berfungsi dan itu sebabnya saya sebutkan -copsi terlebih dahulu.
αғsнιη
Dengan -c, wgetmeminta server untuk data di luar bagian file yang sudah diunduh, tidak ada yang lain. Tidak memeriksa apakah ada perubahan pada bagian file yang sudah diunduh di server. Paling buruk Anda mendapatkan file yang rusak yang merupakan campuran antara file lama dan baru.
jofel
setelah meninjau opsi saya pikir ini hanya berguna untuk sesuatu seperti file log (pembaruan tambahan dijamin), dalam semua kasus lain saya pikir -N atau -nc lebih tepat karena mereka berurusan dengan seluruh file
david.libremone
3

Juga ada opsi lain -ncuntuk wgetting:

--no-clobber
   If a file is downloaded more than once in the same directory, Wget's behavior
   depends on a few options, including -nc.  In certain cases, the local file will
   be clobbered, or overwritten, upon repeated download.  In other cases it will be
   preserved.

Ketika -ncopsi ditentukan, Wget akan menolak untuk men-download salinan file yang sama. Jika Anda memiliki file yang sama yang wgetmencoba untuk mengunduh, itu akan menolak untuk mengunduhnya kecuali jika Anda mengganti nama atau menghapus file lokal.

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
File ‘logo.png’ already there; not retrieving.

Kadang-kadang opsi ini sangat bagus dan saya merekomendasikan untuk menggunakan -ncopsi sebagai ganti keduanya -catau -Nopsi karena opsi ini akan menimpa file unduhan dengan file lokal Anda jika mereka memiliki nama yang sama.

Peringatan (dari komentar jofel)

The -ncpilihan tidak memperbarui file jika itu telah berubah di server. Jika Anda tahu file akan berubah, -Nopsi lebih disukai. Jika Anda tahu file tidak akan berubah (atau Anda tidak peduli) maka -nctidak masalah.

αғsнιη
sumber
1

Saya tahu ini adalah pertanyaan khusus tentang wget tetapi OP memang menyebutkan "Senang menggunakan curl atau alternatif skrip serupa jika wget tidak bisa melakukan ini." Saya tidak yakin apa persyaratannya di sini (banyak file, pertahankan versi lama jika berbeda dari aslinya, ganti dengan versi yang baru diunduh). Bergantung pada apa yang Anda inginkan dan bagaimana Anda ingin menangani duplikat Anda mungkin perlu lebih dari ini .. Cara yang sangat sederhana untuk melakukan apa yang Anda inginkan adalah dengan menggunakan ikal saja.

curl http://cdn.sstatic.net/askubuntu/img/logo.png?v=ca4d192163aa > logo.png

Perintah ini akan mengganti file lama dengan yang baru diunduh setiap kali.

Jangan output ini ke terminal (tanpa "> [nama file]") jika Anda mengunduh file biner sebagai lawan dari teks. Melakukan hal itu akan berpotensi mengacaukan sesi terminal Anda. Jika Anda melakukan ini secara tidak sengaja, Anda mungkin perlu membuka sesi shell / terminal lain.

Goblinlord
sumber
Jika terminal Anda dalam kondisi yang buruk karena Anda menampilkan file biner, mungkin lebih mudah untuk memanggil program "reset" daripada membuka terminal baru.
jofel
Anda benar bahwa saya tidak jelas tentang persyaratan saya, hasil yang membahagiakan adalah saya belajar tentang beberapa opsi :) terima kasih
david.libremone
Terima kasih @jofel ^^ tidak tahu tentang "reset" Saya selalu menutup saja membuka tab baru dan menutup yang kacau ketika ini terjadi ... meskipun saya belum benar-benar sering terjadi.
Goblinlord