আমি যদি tail
25 জিবি পাঠ্য tail
ফাইলটি করতে চাই, কমান্ডটি কি পুরো ফাইলটি পড়ে?
যেহেতু কোনও ফাইল কোনও ডিস্কে ছড়িয়ে ছিটিয়ে থাকতে পারে বলে আমি কল্পনা করেছিলাম তবে এটি অভ্যন্তরীণভাবে ভাল করে বুঝতে পারছি না।
আমি যদি tail
25 জিবি পাঠ্য tail
ফাইলটি করতে চাই, কমান্ডটি কি পুরো ফাইলটি পড়ে?
যেহেতু কোনও ফাইল কোনও ডিস্কে ছড়িয়ে ছিটিয়ে থাকতে পারে বলে আমি কল্পনা করেছিলাম তবে এটি অভ্যন্তরীণভাবে ভাল করে বুঝতে পারছি না।
উত্তর:
না, tail
পুরো ফাইলটি পড়েন না, এটি শেষের দিকে চেষ্টা করে তারপরে ব্লকগুলি পিছনের দিকে পড়ুন যতক্ষণ না প্রত্যাশিত লাইনের সংখ্যা পৌঁছে যায়, তারপরে এটি ফাইলের শেষ অবধি সঠিক লাইনগুলিকে প্রদর্শন করে এবং সম্ভবত পর্যবেক্ষণ করে রাখে -f
বিকল্প ব্যবহার করা হলে ফাইল ।
নোট করুন তবে tail
এর কোনও বিকল্প নেই যদি একটি অন্বেষণযোগ্য ইনপুট সরবরাহ করা হয় তবে উদাহরণস্বরূপ পাইপ থেকে পড়ার সময় পুরো ডেটাটি পড়তে হবে।
অনুরূপভাবে, যখন সমর্থনের সময় tail -n +linenumber
সিনট্যাক্স বা tail +linenumber
অ-মানক বিকল্প ব্যবহার করে ফাইলের শুরু থেকে শুরু হওয়া লাইনগুলি সন্ধান করতে বলা হয় , tail
অবশ্যই পুরো ফাইলটি পড়বে (বাধা না দেওয়া)।
tail +n
পুরো ফাইলটি পড়বে - প্রথমে পছন্দসই সংখ্যক নিউলাইনগুলি খুঁজতে, তারপরে বাকী আউটপুট।
tail
বাস্তবায়ন এটি করে না বা এটি সঠিকভাবে করে না। উদাহরণস্বরূপ ব্যস্তবক্স ১.২১.১ এর ক্ষেত্রে tail
এটি ভাঙা। এছাড়াও মনে রাখবেন আচরণ পরিবর্তিত হয় যখন tail
stdin ing এবং stdin একটি নিয়মিত ফাইল এবং ফাইলের মধ্যে প্রাথমিক অবস্থান আর কোথায় যখন প্রারম্ভে হয় tail
(মত প্রার্থনা করা হয় { cat > /dev/null; tail; } < file
)
আপনি কিভাবে tail
কাজ করে তা দেখতে পারতেন । আপনি যা করতে পারেন তার জন্য আমার একটি ফাইল read
তিনবার করা হয় এবং মোটামুটিভাবে 10 কে বাইট পড়ে থাকে:
strace 2>&1 tail ./huge-file >/dev/null | grep -e "read" -e "lseek" -e "open" -e "close"
open("./huge-file", O_RDONLY) = 3
lseek(3, 0, SEEK_CUR) = 0
lseek(3, 0, SEEK_END) = 80552644
lseek(3, 80551936, SEEK_SET) = 80551936
read(3, ""..., 708) = 708
lseek(3, 80543744, SEEK_SET) = 80543744
read(3, ""..., 8192) = 8192
read(3, ""..., 708) = 708
close(3) = 0
strace
tail
রান করার সময় সিস্টেম কলগুলি কী করে তা দেখায় । সিস্টেম সম্পর্কে কিছু introdaction আহ্বান তুমি এখানে পড়তে পারেন en.wikipedia.org/wiki/System_call । সংক্ষেপে - খুলুন - একটি ফাইল খোলে এবং একটি হ্যান্ডেল ফেরত দেয় (এই উদাহরণে 3), lseek
আপনি যে অবস্থানগুলিতে পড়তে যাচ্ছেন এবং read
কেবল পড়ছেন এবং আপনি দেখতে পাচ্ছেন এটি কতটা বাইট পড়েছে তা ফেরত দেয়,
যেহেতু কোনও ফাইল কোনও ডিস্কে ছড়িয়ে ছিটিয়ে থাকতে পারে বলে আমি ধারণা করি এটির [ক্রমানুসারে ফাইলটি পড়তে হবে), তবে আমি এ জাতীয় অভ্যন্তরগুলি ভালভাবে বুঝতে পারি না।
আপনি এখন জানেন যে, tail
কেবল ফাইলটির শেষের দিকে (সিস্টেম কল সহ lseek
) সন্ধান করুন এবং পিছনের দিকে কাজ করুন। তবে উপরোক্ত উদ্ধৃত মন্তব্যে আপনি ভাবছেন "ফাইলের শেষটি কোথায় পাওয়া যাবে ডিস্কে লেজটি কীভাবে জানতে পারে?"
উত্তরটি সহজ: লেজ জানে না। ব্যবহারকারী-স্তরের প্রক্রিয়াগুলি ফাইলগুলিকে অবিচ্ছিন্ন স্ট্রিম হিসাবে দেখায়, তাই সকলেই tail
জানতে পারে যে ফাইলের শুরু থেকে অফসেট। তবে ফাইল সিস্টেমে ফাইলটির "ইনোড" (ডিরেক্টরি এন্ট্রি) ফাইলের ডেটা ব্লকগুলির শারীরিক অবস্থান বোঝায় এমন সংখ্যার তালিকার সাথে যুক্ত। আপনি যখন ফাইলটি থেকে পড়েন, কার্নেল / ডিভাইস ড্রাইভারটি আপনাকে কোন অংশটি প্রয়োজন তা নির্ধারণ করে, এটির অবস্থানটি ডিস্কে কাজ করে এবং এটি আপনার জন্য নিয়ে আসে।
এটি আমাদের ধরণের অপারেটিং সিস্টেমগুলির মতো: তাই আপনার ফাইলের ব্লকগুলি কোথায় ছড়িয়ে গেছে সে সম্পর্কে আপনাকে চিন্তা করার দরকার নেই।
যদি head
বা tail
মনে হচ্ছে সম্পূর্ণ ফাইল পড়া হবে, একটি সম্ভাব্য কারণ যে ফাইল অল্পই অথবা কোনো সম্পর্কে newline অক্ষর রয়েছে । আমি কয়েক মাস আগে এটির একটি খুব বড় (গিগাবাইট) JSON ব্লাব দিয়ে ট্রিপ করেছিলাম যা কোনও সাদা অংশ ছাড়াই সিরিয়ালিত হয়েছিল, এমনকি তারেও নয় in
আপনার যদি জিএনইউ হেড / লেজ থাকে তবে আপনি লাইনের পরিবর্তে -c N
প্রথম / শেষ এন বাইটগুলি মুদ্রণ করতে ব্যবহার করতে পারেন , তবে দুর্ভাগ্যক্রমে এটি পসিক্স বৈশিষ্ট্য নয়।
আপনি সোর্স কোড লাইনে 525 দেখতে পারেন, আপনি বাস্তবায়নের জন্য মন্তব্যগুলি দেখতে পারেন।
/* Print the last N_LINES lines from the end of file FD.
Go backward through the file, reading 'BUFSIZ' bytes at a time (except
probably the first), until we hit the start of the file or have
read NUMBER newlines.
START_POS is the starting position of the read pointer for the file
associated with FD (may be nonzero).
END_POS is the file offset of EOF (one larger than offset of last byte).
Return true if successful. */