Wget'i kopya oluşturmayı durdurabilir miyim?


13

Eğer wget'i iki kere çalıştırırsam, o dosyayı zaten indirmiş olduğunu fark etmez ve yeni bir dosya oluşturur. Dosyayı tekrar indirmesini önlemenin bir yolu var mı?

$ 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’
...

(Eğer wget bunu yapamazsa kıvırmak veya benzer bir yazılabilir alternatif kullanmaktan mutluluk duyarız.)


9
Yeni bir dosya oluşturur çünkü dosyanın orada olduğunu fark eder!
nico

Yanıtlar:


17

-NSeçeneği kullanmanızı öneririm .

-N
--timestamping
    Turn on time-stamping.

Dosyayı yalnızca sunucuda indirilen sürümden daha yeni olduğunda yeniden indiren zaman damgasını etkinleştirir.

$ 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.

Uyarı (KasiyA'nın yorumundan)

Sunucu düzgün yapılandırılmamışsa, her zaman dosyanın yeni olduğunu bildirebilir ve dosyayı -Nher zaman yeniden indirir. Bu durumda, -ncmuhtemelen daha iyi bir seçenektir.


3
Bir sunucu düzgün yapılandırılmadığında -Nbaşarısız olabilir ve wget her zaman yeniden indirilir. Yani bazen -ncdaha iyidir-N
αғsнιη

1
@Kasiy Yorumunuz için teşekkürler, tüm durumlar için iyi bir seçenek yok gibi görünüyor.
jofel

16

Evet -cseçenek.

--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.

Dosya aynıysa, ikinci indirme denemesi durur.

$ 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.

Uyarılar (jofel'in yorumlarından)

Dosya sunucuda değiştiyse, -cseçenek yanlış sonuçlar verebilir.

İle -c, wget basitçe sunucudan zaten indirilmiş dosyanın bir kısmının ötesinde herhangi bir veri ister, başka bir şey ister. Dosyanın indirilmiş olan kısmında herhangi bir değişiklik olup olmadığını kontrol etmez. Böylece, eski ve yeni dosyanın bir karışımı olan bozuk bir dosya olabilir.


Yerel test

(Sayesinde aşağıdaki gibi basit yerel web sunucusu çalıştırarak test edebilirsiniz @roadmr 'ın cevabı ):

Bir Terminal penceresi açın ve şunu yazın:

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

Şimdi başka bir Terminal açın ve şunları yapın:

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

Bunu indirmek istediğimiz filename-to-downloaddosya olduğuna dikkat /path/to/parent-download-dir/edin.

Şimdi wget komutunu birden çok kez çalıştırırsanız şunu göreceksiniz:

The file is already fully retrieved; nothing to do.

Tamam, şimdi /path/to/parent-download-dir/dizine gidin ve kaynak dosyaya bir şey ekleyin, örneğin bir metin dosyasıysa, içine basit bir ekstra satır ekleyin ve dosyayı kaydedin. Şimdi deneyin wget -c .... Harika, şimdi dosyanın yeniden indirildiğini göreceksiniz ancak daha önce indirdiniz.

Sebep: neden yeniden indiriliyor?

çünkü boyutu eski indirilen dosyadan daha büyük bir boyuta değiştirildi ve başka bir şey yok.


1
Dosya sunucuda indirmeler arasında değiştiyse, bu düzgün çalışmaz. En kötü durumda (dosya boyutu arttı), bozuk bir dosya alırsınız.
jofel

1
@jofel evet dediğin -ncgibi değil ama -cseçenek işe yarayacak ve bu yüzden önce -cseçenekten bahsetmiştim .
αғsнιη

İle -c, wgetsunucudan indirilmiş olan dosyanın ötesinde herhangi bir veri ister, başka bir şey istemez. Bu arada sunucuda dosyanın indirilmiş olan kısmında herhangi bir değişiklik olup olmadığını kontrol etmez. En kötüsü, eski ve yeni dosya arasındaki bir karışım olan bozuk bir dosya alırsınız.
jofel

seçenekleri inceledikten sonra bunun sadece bir günlük dosyası (garantili artımlı güncellemeler) gibi bir şey için yararlı olduğunu düşünüyorum, diğer tüm durumlarda -N veya -nc'nin tüm dosyalarla
uğraşırken

3

Ayrıca -ncwgetting için çağrılan başka bir seçenek var :

--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.

Ne zaman -ncseçeneği belirtilmişse, Wget aynı dosyanın kopyalarını indirmek için reddedecektir. wgetİndirmeye çalışan aynı dosyaya sahipseniz, yerel dosyayı yeniden adlandırmaz veya kaldırmazsanız indirmeyi reddeder.

$ 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.

Bazen bu seçenek çok iyi ve -ncher ikisi -cveya seçenek yerine seçeneği kullanmanız önerilir, -Nçünkü bu seçenekler aynı isme sahiplerse indirme dosyasının üzerine yerel dosyanızla yazacaktır .

Uyarı (jofel'in yorumundan)

Bu -ncseçenek, sunucuda değiştiyse dosyayı güncelleştirmez. Dosyanın değişeceğini biliyorsanız, -Nseçenek tercih edilir. Dosyanın değişmeyeceğini biliyorsanız (ya da umursamıyorsanız) -nctamamdır.


1

Bunun wget ile ilgili özel bir soru olduğunu biliyorum ama OP "wget ​​bunu yapamazsa kıvırmak veya benzer bir komut dosyası kullanmak için mutlu" dedi. Burada gereksinimin ne olduğundan emin değilim (birden fazla dosya, orijinalden farklıysa eski sürümü tutun, yeni indirilen sürümle değiştirin). Ne istediğinize ve kopyaları nasıl işlemek istediğinize bağlı olarak bundan daha fazlasına ihtiyacınız olabilir .. İstediğinizi yapmanın çok basit bir yolu bunun yerine kıvrılmayı kullanmaktır.

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

Bu komut her seferinde eski dosyayı yeni indirilen dosyayla değiştirir.

Metnin aksine bir ikili dosya indiriyorsanız, bunu terminale ("> [dosyaadı]" olmadan) göndermeyin. Bunu yapmanız terminal oturumunuzla ilgili karışıklığa neden olabilir. Bunu kazayla yapmanız durumunda başka bir kabuk / terminal oturumu açmanız gerekebilir.


Eğer ikili dosyaları görüntülediğiniz için terminaliniz kötü durumda ise, programı "reset" olarak adlandırmak yeni bir terminal açmaktan daha kolaydır.
jofel

Gereksinimlerim konusunda net olmadığım için haklısın, mutlu sonuç, birkaç seçenek daha öğrendiğim :) teşekkürler
david.libremone

Teşekkürler @jofel ^^ "sıfırlama" hakkında bilmiyordum Her zaman yeni bir sekme açtım ve bu olduğunda garip olanı kapattım ... gerçekten sık sık olmadı.
Goblinlord
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.