Jak zapewnić, że najnowsza wersja pliku zostanie całkowicie pobrana przy jednoczesnym zminimalizowaniu transferu sieciowego

2

Szukam polecenia powłoki, które zapewnia, że ​​plik zostanie całkowicie pobrany, ale unika się niepotrzebnego ponownego pobierania. Oto pseudokod tego, na co liczę:

If file doesn't exist, download it.
If file exists:
    use HTTP HEAD to get timestamp and size of remote file.
    if remote timestamp is newer, delete local file and download remote file
    if timestamps are the same:
        if remote size is greater than local size:
            resume download
        if remote size is equal to local size:
            do nothing
        if remote size is less than local size:
            do nothing but issue a warning because this is weird

wget jest w stanie wznowić przerwane przelewy za pomocą -c opcja, ale muszę śledzić gdzieś, że została przerwana, abym mógł wiedzieć, że przekazać tę opcję i wymaga ponownego uruchomienia polecenia.

wget -N upewnia się, że unikniesz pobierania pliku, jeśli znacznik czasu zdalnego pliku nie jest nowszy niż lokalny. Ale nie wie, czy transfery zostały przerwane, a tym samym nic nie zrobi, gdy zadzwoni ponownie przy przerwanym transferze.

curl -C - pobierze plik, jeśli nie będzie obecny, i wznowi go, jeśli zostanie tylko częściowo pobrany. Ale jeśli obecny jest całkowicie pobrany plik, daje mi błędy dotyczące tego, że serwer nie obsługuje zakresów bajtów.

Przypuszczam, że sam mógłbym napisać coś, aby zaimplementować mój pseudokod, ale wydaje mi się, że byłoby to dość powszechne pragnienie, o które proszę, czy istnieje jakiś sposób na to?

Josh Hansen
źródło

Odpowiedzi:

2

Możesz użyć -c flaga wget nawet jeśli nie zacząłeś pobierać pliku. Powinno to działać w twoim celu:

while ! wget -qc $url; do :; done

To jest nieskończona pętla, dopóki wget kończy się sukcesem. Jeśli plik zostanie częściowo pobrany, pętla będzie kontynuowana i wget kontynuuje tam, gdzie skończył.

janos
źródło
1
To wydaje się działać dobrze. Nie jestem pewien, czy szanuje znaczniki czasowe, jak to opisałem, ale w zasadzie jest to, czego potrzebuję.
Josh Hansen