Pertanyaan Bisakah saya berhenti membuat duplikat?


Jika saya menjalankan wget dua kali, itu tidak mengenali bahwa ia telah mengunduh file itu, dan membuat yang baru. Adakah 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 keriting atau alternatif skrip yang serupa jika wget tidak bisa melakukan ini.)


11
2018-01-13 11:06


asal


Yah itu menciptakan yang baru karena TIDAK mengenali file yang ada! - nico


Jawaban:


Saya sarankan Anda menggunakan -N pilihan.

-N
--timestamping
    Turn on time-stamping.

Ini memungkinkan time-stamping, yang mengunduh ulang file hanya jika yang 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, mungkin selalu melaporkan bahwa file tersebut baru dan -N akan selalu mengunduh ulang file. Pada kasus ini, -nc mungkin adalah opsi yang lebih baik.


16
2018-01-13 12:54



Ketika server tidak dikonfigurasi dengan benar -N mungkin gagal dan wget akan selalu diunduh ulang. Jadi terkadang -nc lebih baik dari -N - αғsнιη
@Kasiy terima kasih atas komentar Anda, sepertinya tidak ada pilihan yang baik untuk semua kasus. - jofel


Ya itu -c pilihan.

--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 itu sama, upaya pengunduhan 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 pada server, maka -c pilihan dapat memberikan hasil yang salah.

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


Tes lokal

Anda dapat mengujinya dengan menjalankan web-server lokal sederhana sebagai berikut (Terima kasih @roadmr's menjawab):

Buka jendela dan jenis Terminal:

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

Sekarang buka Terminal lain dan lakukan:

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

Perhatikan itu filename-to-download adalah file yang terletak di /path/to/parent-download-dir/ yang kami ingin mengunduhnya.

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

The file is already fully retrieved; nothing to do.

Ok, sekarang pergi /path/to/parent-download-dir/ direktori dan menambahkan sesuatu ke file sumber, misalnya jika itu adalah file teks, tambahkan baris tambahan sederhana di dalamnya dan simpan file tersebut. Sekarang coba wget -c ... . Hebat, sekarang Anda akan melihat file kembali mengunduh lagi tetapi Anda sudah mengunduhnya sebelumnya.

Alasan: mengapa mengunduh ulang?

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


13
2018-01-13 11:10



Ini tidak berfungsi dengan benar jika file telah berubah di server antara unduhan. Dalam kasus terburuk (ukuran file telah meningkat), Anda mendapatkan file yang rusak. - jofel
@jofel ya -nc tidak seperti yang kamu katakan tapi -c pilihan akan bekerja dan itulah mengapa saya sebutkan -c pilihan pertama. - αғsнιη
Dengan -c, wget meminta server untuk data apa pun di luar bagian file yang sudah diunduh, tidak ada yang lain. Itu tidak memeriksa apakah ada perubahan di bagian file yang sudah diunduh di server. Paling buruk Anda mendapatkan file 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 yang dijamin), dalam semua kasus lain saya pikir -N atau -nc lebih tepat karena mereka menangani seluruh file - d3vid


Juga ada opsi lain yang disebut -nc untuk 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.

Kapan -nc opsi ditentukan, Wget akan menolak mengunduh salinan file yang sama. Jika Anda memiliki file yang sama itu wget mencoba untuk mengunduh, ia akan menolak untuk mengunduhnya kecuali 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.

Terkadang opsi ini sangat bagus dan saya merekomendasikan untuk menggunakannya -nc bukan pilihan keduanya -c atau -N pilihan karena opsi ini akan menimpa file unduhan dengan file lokal Anda jika mereka memiliki nama yang sama.

Peringatan (dari komentar jofel)

Itu -nc opsi tidak memperbarui file jika telah berubah di server. Jika Anda tahu file akan berubah, itu -N pilihan lebih disukai. Jika Anda tahu file tersebut tidak akan berubah (atau Anda tidak peduli) kemudian -nc tidak apa-apa.


2
2018-01-14 12:37





Saya tahu ini adalah pertanyaan spesifik mengenai wget tetapi OP menyebutkan "Senang menggunakan ikal atau alternatif skrip yang serupa jika wget tidak dapat melakukan ini." Saya tidak yakin apa persyaratannya di sini (banyak file, tetap versi lama jika berbeda dari yang asli, ganti dengan versi yang baru diunduh). Tergantung pada apa yang Anda inginkan dan bagaimana Anda ingin menangani duplikat Anda mungkin membutuhkan lebih dari ini .. Cara yang sangat sederhana untuk melakukan apa yang Anda inginkan adalah hanya menggunakan curl sebagai gantinya.

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

Perintah ini akan menggantikan file lama dengan yang baru diunduh setiap saat.

Jangan output ini ke terminal (tanpa "> [filename]") jika Anda mengunduh file biner yang bertentangan dengan teks. Melakukan hal itu akan berpotensi mengacaukan sesi terminal Anda. Dalam hal ini Anda melakukan ini karena kecelakaan Anda mungkin perlu membuka sesi shell / terminal lain.


1
2018-01-14 05:14



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