শেষ আপডেটের পরে পরিবর্তিত হলে কেবল HTTP- র মাধ্যমে ফাইল ডাউনলোড করুন


20

আমার এইচটিটিপি সার্ভার থেকে একটি ফাইল ডাউনলোড করা দরকার তবে কেবলমাত্র যদি এটি শেষবার ডাউনলোড করার পরে পরিবর্তিত হয় তবে (যেমন If-Modified-Sinceশিরোনামের মাধ্যমে )। আমার ডিস্কে থাকা ফাইলটির জন্য আমার একটি কাস্টম নামও ব্যবহার করা দরকার।

লিনাক্সে এই কাজের জন্য আমি কোন সরঞ্জামটি ব্যবহার করতে পারি?


wget -Nব্যবহার করা -Nযাবে না কারণ ব্যবহার করা যায় না -O


কেন ফাইলটি ডাউনলোড করে আবার নামকরণ করবেন না?
জুলিয়ান নাইট

.. কারণ সরঞ্জামটি এখনও চেক করতে সক্ষম হওয়া দরকার যে শেষ ডাউনলোডের পরে এইচটিটিপি রিসোর্স পরিবর্তন হয়েছে? ফাইলটির নতুন নামকরণ করা হয়েছে এবং সরঞ্জামটি প্রত্যাশা করে এমন জায়গায় আর উপস্থিত না থাকলে এটি শক্ত হবে।
cweiske

দুঃখিত, আমি এই মন্তব্যটি ছুটেছি, আমার উত্তর দেখুন।
জুলিয়ান নাইট

উত্তর:


26

curlপরিবর্তে ব্যবহার বিবেচনা করুন wget:

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

man curl বলেছেন:

-z/ --time-cond <তারিখের অভিব্যক্তি>

(HTTP / FTP) প্রদত্ত সময় এবং তারিখের চেয়ে পরে সংশোধিত একটি ফাইল বা সেই সময়ের আগে সংশোধন করা হয়েছে এমন একটি ফাইলের জন্য অনুরোধ করুন। তারিখের প্রকাশটি সমস্ত ধরণের তারিখের স্ট্রিং হতে পারে বা এটি কোনও অভ্যন্তরীণগুলির সাথে মেলে না, তবে পরিবর্তে প্রদত্ত ফাইলের নাম থেকে সময় নেওয়ার চেষ্টা করে।

যদি $fileনা অগত্যা প্রাক বিদ্যমান নয়, আপনি ব্যবহার করতে করতে হবে -zব্যবহার করে, পতাকা শর্তাধীন test -e "$file":

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

(মনে রাখবেন যে আমরা $zflagএখানে বিস্তৃতি উদ্ধৃত করি না , কারণ আমরা এটি 0 বা 2 টোকনে বিভক্ত করতে চাই)।

যদি আপনার শেলটি অ্যারে সমর্থন করে (যেমন বাশ), তবে আমাদের একটি নিরাপদ এবং ক্লিনার সংস্করণ রয়েছে:

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

7

উইজেট স্যুইচটি -Nকেবল তখনই ফাইলটি পায় যা এটি পরিবর্তিত হয়েছে তাই একটি সম্ভাব্য পদ্ধতির জন্য সহজ -Nসুইচটি ব্যবহার করা হবে যা যদি প্রয়োজন হয় তবে এটি ফাইলটি পেতে হবে তবে এটি ভুল নাম দিয়ে রেখে দেয়। তারপরে ln -Pসঠিক নামের সাথে একটি "ফাইল" এর সাথে লিঙ্ক করতে কমান্ডটি ব্যবহার করে একটি হার্ড লিঙ্ক তৈরি করুন । লিঙ্কযুক্ত ফাইলের মূল হিসাবে একই মেটাডেটা আছে।

কেবলমাত্র সীমাবদ্ধতা হ'ল ফাইল সিস্টেমের সীমানা জুড়ে আপনার হার্ড লিঙ্ক থাকতে পারে না।


অনেকগুলি উদ্দেশ্যে, একটি প্রতীকী লিঙ্ক পর্যাপ্ত হতে পারে - যদি না ইনোড পরিচয়টি আসলে প্রশ্নকারীটির জন্য গুরুত্বপূর্ণ matters
টবি স্পিড 10

1
এই কাজের জন্য সবচেয়ে ভাল সরঞ্জাম হ'ল উইজেট। এটি টাইমস্ট্যাম্প এবং ফাইলের আকার পরীক্ষা করে, যা কার্ল (7.38.0) দেয় না। এছাড়াও, 4X / 5xx তে উইজেট নন -0 দিয়ে শেষ হয়, অন্যদিকে কার্ল সত্যিকার অর্থে ডিফল্টরূপে সার্ভার-কোডগুলি যত্ন করে না।
schieferstapel

4

কার্ল কমান্ড মোড়ানোর জন্য পাইথন 3.5+ স্ক্রিপ্ট:

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 (),
))

এটা সত্যিই দারুন! টিআইএল chain:)
জন অক্সলে

1

" তারিখ পরীক্ষা " ("কার্ল - টাইম-কনড" সহ) অনুরূপ পন্থা ফাইল আকারের তুলনা অনুযায়ী ডাউনলোড করা হবে, অর্থাত্ যদি স্থানীয় ফাইলের দূরবর্তী ফাইলের চেয়ে আলাদা আকার থাকে তবে ডাউনলোড করুন

উদাহরণস্বরূপ, এটি কার্যকর যখন ডাউনলোডের প্রক্রিয়াটি মাঝখানে ব্যর্থ হয় এবং এভাবে স্থানীয় ডাউনলোড করা ফাইলটি রিমোট ফাইলের চেয়ে নতুন তারিখ পায় তবে এটি প্রকৃতভাবে দূষিত এবং পুনরায় ডাউনলোডের প্রয়োজন:

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

"কার্ল -z / - টাইম-কনড" বিকল্পটি (এটি অন্য উত্তরে প্রস্তাবিত হয়েছিল) এই ক্ষেত্রে রিমোট ফাইলটি ডাউনলোড করবে না (কারণ স্থানীয় ফাইলটির নতুন তারিখ রয়েছে), তবে এই " আকারের চেক " স্ক্রিপ্টটি হবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.