http:


20

Bir HTTP sunucusundan bir dosya indirmem gerekiyor, ancak yalnızca son indirdiğimden beri değiştiğinde (örn. If-Modified-SinceBaşlık aracılığıyla ). Ayrıca diskimdeki dosya için özel bir ad kullanmam gerekiyor.

Linux'ta bu görev için hangi aracı kullanabilirim?


wget -Nkullanılamaz çünkü -Nkullanılamaz -O.


Neden dosya indirmek değil ve daha sonra yeniden adlandırın?
Julian Knight

.. çünkü aracın hala son indirmeden bu yana HTTP kaynağının değişip değişmediğini kontrol edebilmesi gerekiyor mu? Dosya yeniden adlandırıldıysa ve böylece aracın beklediği yerde artık mevcut değilse bu zor olacaktır.
cweiske

Üzgünüm, bu yorumu acele ettim, cevabımı görün.
Julian Knight

Yanıtlar:


26

Şunun curlyerine kullanmayı düşünün wget:

curl -o "$file" -z "$file" "$uri"

man curl diyor:

-z/ --time-cond <tarih ifadesi>

(HTTP / FTP) Belirtilen saat ve tarihten sonra veya daha önce değiştirilmiş bir dosyayı isteyin. Tarih ifadesi, her türlü tarih dizesi olabilir veya herhangi bir dahili dizeyle eşleşmiyorsa, saati belirli bir dosya adından almaya çalışır.

Eğer $fileille mevcut olamayacağı önceden değil, siz faydalanmak gerekir -zkullanarak, bayrak Koşullu test -e "$file":

if test -e "$file"
then zflag="-z '$file'"
else zflag=
fi
curl -o "$file" $zflag "$uri"

( $zflag0 veya 2 jetonuna bölünmesini istediğimiz için burada genişlemeyi teklif etmediğimizi unutmayın ).

Kabuğunuz dizileri destekliyorsa (örn. Bash), daha güvenli ve daha temiz bir sürümümüz var:

if test -e "$file"
then zflag=(-z "$file")
else zflag=()
fi
curl -o "$file" "${zflag[@]}" "$uri"

7

Wget anahtarı -Nsadece değiştiğinde dosyayı alır, bu yüzden olası bir yaklaşım, gerekiyorsa -Ndosyayı alacak basit bir anahtar kullanmak olacaktır, ancak yanlış adla bırakır. Ardından ln -P, doğru adla bir "dosyaya" bağlamak için komutu kullanarak bir sabit bağlantı oluşturun . Bağlantılı dosya orijinaliyle aynı meta verilere sahiptir.

Tek sınırlama dosya sistemi sınırları boyunca sabit bağlantıları olamaz olmasıdır.


Birçok amaç için, sembolik bir bağlantı yeterli olabilir - inode kimliği aslında asker için önemli değilse.
Toby Speight

1
wget bu iş için daha iyi bir araçtır. Bu zaman damgasını VE kıvrılma (7.38.0) olmayan dosya boyutunu kontrol eder. Ayrıca, wget 4xx / 5xx üzerinde 0 ile sonlanır, ancak curl varsayılan olarak sunucu kodlarını gerçekten önemsemez.
schieferstapel

4

Curl komutunu sarmalamak için Python 3.5+ betiği:

import argparse
import pathlib

from subprocess import run
from itertools import chain

parser = argparse.ArgumentParser()
parser.add_argument('url')
parser.add_argument('filename', type=pathlib.Path)
args = parser.parse_args()

run(chain(
    ('curl', '-s', args.url),
    ('-o', str(args.filename)),
    ('-z', str(args.filename)) if args.filename.exists() else (),
))

Bu harika! TIL chain:)
John Oxley

1

" Tarih kontrolüne " benzer bir yaklaşım ("curl --time-cond" ile), dosya boyutu karşılaştırmasına göre indirmek olacaktır, yani yalnızca yerel dosya uzak dosyadan farklı bir boyuta sahipse indirin .

Örneğin, indirme işlemi ortada başarısız olduğunda ve bu nedenle yerel indirilen dosya uzak dosyadan daha yeni bir tarih aldığında yararlıdır , ancak aslında bozuktur ve yeniden indirme gereklidir:

local_file_size=$([[ -f ${FILE_NAME} ]] && wc -c < ${FILE_NAME} || echo "0")
remote_file_size=$(curl -sI ${FILE_URL} | awk '/Content-Length/ { print $2 }' | tr -d '\r' )

if [[ "$local_file_size" -ne "$remote_file_size" ]]; then
    curl -o ${FILE_NAME} ${FILE_URL}
fi

"Curl -z / --time-cond" seçeneği (başka bir cevapta önerildi) bu durumda uzak dosyayı indirmez (yerel dosyanın daha yeni bir tarihe sahip olmasına neden olur), ancak bu " boyut denetimi " komut dosyası!

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.