লেজ পুরো ফাইলটি পড়ে?


113

আমি যদি tail25 জিবি পাঠ্য tailফাইলটি করতে চাই, কমান্ডটি কি পুরো ফাইলটি পড়ে?

যেহেতু কোনও ফাইল কোনও ডিস্কে ছড়িয়ে ছিটিয়ে থাকতে পারে বলে আমি কল্পনা করেছিলাম তবে এটি অভ্যন্তরীণভাবে ভাল করে বুঝতে পারছি না।

উত্তর:


119

না, tailপুরো ফাইলটি পড়েন না, এটি শেষের দিকে চেষ্টা করে তারপরে ব্লকগুলি পিছনের দিকে পড়ুন যতক্ষণ না প্রত্যাশিত লাইনের সংখ্যা পৌঁছে যায়, তারপরে এটি ফাইলের শেষ অবধি সঠিক লাইনগুলিকে প্রদর্শন করে এবং সম্ভবত পর্যবেক্ষণ করে রাখে -fবিকল্প ব্যবহার করা হলে ফাইল ।

নোট করুন তবে tailএর কোনও বিকল্প নেই যদি একটি অন্বেষণযোগ্য ইনপুট সরবরাহ করা হয় তবে উদাহরণস্বরূপ পাইপ থেকে পড়ার সময় পুরো ডেটাটি পড়তে হবে।

অনুরূপভাবে, যখন সমর্থনের সময় tail -n +linenumberসিনট্যাক্স বা tail +linenumberঅ-মানক বিকল্প ব্যবহার করে ফাইলের শুরু থেকে শুরু হওয়া লাইনগুলি সন্ধান করতে বলা হয় , tailঅবশ্যই পুরো ফাইলটি পড়বে (বাধা না দেওয়া)।


14
অভিশাপ, খুব দ্রুত :-)। এখানে সম্পর্কিত উত্স কোডফাইলের এফডি এর শেষ থেকে শেষের N_LINES লাইনগুলি মুদ্রণ করুন। আমরা ফাইলটির শুরুতে আঘাত না করা বা NUMBER টি নতুন লাইন না পড়া পর্যন্ত, একসাথে (সম্ভবত প্রথমটি বাদ দিয়ে) 'বুফসিজ্যাড' বাইটস পড়ার পরে ফাইলটি পিছিয়ে যান।
প্যাট্রিক

1
এছাড়াও, tail +nপুরো ফাইলটি পড়বে - প্রথমে পছন্দসই সংখ্যক নিউলাইনগুলি খুঁজতে, তারপরে বাকী আউটপুট।
এসএফ

@SF। প্রকৃতপক্ষে, উত্তর আপডেট হয়েছে।
jlliagre

4
নোট করুন যে সমস্ত tailবাস্তবায়ন এটি করে না বা এটি সঠিকভাবে করে না। উদাহরণস্বরূপ ব্যস্তবক্স ১.২১.১ এর ক্ষেত্রে tailএটি ভাঙা। এছাড়াও মনে রাখবেন আচরণ পরিবর্তিত হয় যখন tailstdin ing এবং stdin একটি নিয়মিত ফাইল এবং ফাইলের মধ্যে প্রাথমিক অবস্থান আর কোথায় যখন প্রারম্ভে হয় tail(মত প্রার্থনা করা হয় { cat > /dev/null; tail; } < file)
Stéphane Chazelas

4
@ স্টাফেনচাজেলাস * নিক্স - অদ্ভুত প্রান্তের কেস-জগতের পরিস্থিতি স্বাভাবিক হয়ে উঠছে। (যদিও অন্বেষণযোগ্য বনাম অন্বেষণযোগ্য ইনপুটগুলি অবশ্যই একটি বৈধ পয়েন্ট))
সিভিএন

69

আপনি কিভাবে 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

আমি দেখতে পাচ্ছি না কীভাবে এটি প্রশ্নের উত্তর দেয়। এখানে কী চলছে তা আপনি ব্যাখ্যা করতে পারেন?
আইয়েন স্যামুয়েল ম্যাকলিন এল্ডার

10
stracetailরান করার সময় সিস্টেম কলগুলি কী করে তা দেখায় । সিস্টেম সম্পর্কে কিছু introdaction আহ্বান তুমি এখানে পড়তে পারেন en.wikipedia.org/wiki/System_call । সংক্ষেপে - খুলুন - একটি ফাইল খোলে এবং একটি হ্যান্ডেল ফেরত দেয় (এই উদাহরণে 3), lseekআপনি যে অবস্থানগুলিতে পড়তে যাচ্ছেন এবং readকেবল পড়ছেন এবং আপনি দেখতে পাচ্ছেন এটি কতটা বাইট পড়েছে তা ফেরত দেয়,
সের্গেই কুরেনকভ

2
সুতরাং সিস্টেম কলগুলি বিশ্লেষণ করলে আপনি মাঝে মাঝে বুঝতে পারবেন কোনও প্রোগ্রাম কীভাবে কাজ করে।
সের্গেই কুরেনকভ

26

যেহেতু কোনও ফাইল কোনও ডিস্কে ছড়িয়ে ছিটিয়ে থাকতে পারে বলে আমি ধারণা করি এটির [ক্রমানুসারে ফাইলটি পড়তে হবে), তবে আমি এ জাতীয় অভ্যন্তরগুলি ভালভাবে বুঝতে পারি না।

আপনি এখন জানেন যে, tailকেবল ফাইলটির শেষের দিকে (সিস্টেম কল সহ lseek) সন্ধান করুন এবং পিছনের দিকে কাজ করুন। তবে উপরোক্ত উদ্ধৃত মন্তব্যে আপনি ভাবছেন "ফাইলের শেষটি কোথায় পাওয়া যাবে ডিস্কে লেজটি কীভাবে জানতে পারে?"

উত্তরটি সহজ: লেজ জানে না। ব্যবহারকারী-স্তরের প্রক্রিয়াগুলি ফাইলগুলিকে অবিচ্ছিন্ন স্ট্রিম হিসাবে দেখায়, তাই সকলেই tailজানতে পারে যে ফাইলের শুরু থেকে অফসেট। তবে ফাইল সিস্টেমে ফাইলটির "ইনোড" (ডিরেক্টরি এন্ট্রি) ফাইলের ডেটা ব্লকগুলির শারীরিক অবস্থান বোঝায় এমন সংখ্যার তালিকার সাথে যুক্ত। আপনি যখন ফাইলটি থেকে পড়েন, কার্নেল / ডিভাইস ড্রাইভারটি আপনাকে কোন অংশটি প্রয়োজন তা নির্ধারণ করে, এটির অবস্থানটি ডিস্কে কাজ করে এবং এটি আপনার জন্য নিয়ে আসে।

এটি আমাদের ধরণের অপারেটিং সিস্টেমগুলির মতো: তাই আপনার ফাইলের ব্লকগুলি কোথায় ছড়িয়ে গেছে সে সম্পর্কে আপনাকে চিন্তা করার দরকার নেই।


2

যদি headবা tail মনে হচ্ছে সম্পূর্ণ ফাইল পড়া হবে, একটি সম্ভাব্য কারণ যে ফাইল অল্পই অথবা কোনো সম্পর্কে newline অক্ষর রয়েছে । আমি কয়েক মাস আগে এটির একটি খুব বড় (গিগাবাইট) JSON ব্লাব দিয়ে ট্রিপ করেছিলাম যা কোনও সাদা অংশ ছাড়াই সিরিয়ালিত হয়েছিল, এমনকি তারেও নয় in

আপনার যদি জিএনইউ হেড / লেজ থাকে তবে আপনি লাইনের পরিবর্তে -c Nপ্রথম / শেষ এন বাইটগুলি মুদ্রণ করতে ব্যবহার করতে পারেন , তবে দুর্ভাগ্যক্রমে এটি পসিক্স বৈশিষ্ট্য নয়।


1

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