কোন সম্ভাব্য পরিস্থিতি আছে যখন
ls -l file.txt
বাইট হিসাবে একই সংখ্যা দেখাচ্ছে না
wc -c file.txt
একটি স্ক্রিপ্টে আমি সেই দুটি মানের তুলনা পেয়েছি। এর কারণ কী হতে পারে? একই ফাইলটির বিভিন্ন বাইট সংখ্যা থাকাও কি সম্ভব?
কোন সম্ভাব্য পরিস্থিতি আছে যখন
ls -l file.txt
বাইট হিসাবে একই সংখ্যা দেখাচ্ছে না
wc -c file.txt
একটি স্ক্রিপ্টে আমি সেই দুটি মানের তুলনা পেয়েছি। এর কারণ কী হতে পারে? একই ফাইলটির বিভিন্ন বাইট সংখ্যা থাকাও কি সম্ভব?
উত্তর:
হ্যাঁ, এরকম কেস রয়েছে।
ক্ষেত্রে symlinks গনুহ সাথে Linux সিস্টেমে ls
, ls -l
লিংক আকার আউট করা হবে, যখন wc -c
প্রকৃত ফাইল সমাধান এবং সেখানে বাইটের সংখ্যা পড়বে। নীচে আপনি দেখতে পারেন যে ls -l
29 বাইট wc
প্রতিবেদন করে , যখন আসল ফাইলে 172 বাইট রিপোর্ট করে।
$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 29 1月 17 2016 /etc/resolv.conf -> ../run/resolvconf/resolv.conf
$ wc -c /etc/resolv.conf
172 /etc/resolv.conf
$ wc -c /var/run/resolvconf/resolv.conf
172 /var/run/resolvconf/resolv.conf
$ ls -l /var/run/resolvconf/resolv.conf
-rw-r--r-- 1 root root 172 1月 15 15:49 /var/run/resolvconf/resolv.conf
ক্ষেত্রে ভার্চুয়াল ফাইল সিস্টেম , যেমন/proc
বা /sys
, অনেক ফাইল আছে আকার 0 হিসাবে দেখাবে ls -l
। /dev
ফাইল সিস্টেমের অধীনে আমাদের কাছে বিভিন্ন ধরণের বিশেষ ফাইল রয়েছে যেমন ক্যারেক্টার ডিভাইস এবং ব্লক ডিভাইস - wc -c
সেগুলিতে ঝুলিয়ে রাখা হয় এবং আকারের পরিবর্তে বড় এবং ছোটখাটো সংখ্যাls -l
দেখায় ।
নামযুক্ত পাইপগুলি0
বাইট হিসাবে প্রতিবেদন করা হবে ls -c
, তবে wc -c
আসলে পাইপের বিষয়বস্তু পড়বে, তাই প্রযুক্তিগতভাবে এটি আপনাকে জানাবে যে নামক পাইপে কতটা ডেটা রয়েছে:
$ mkfifo named.pipe
$ echo "This is a test" > named.pipe &
[1] 2129
$ ls -l named.pipe
prw-rw-r-- 1 xieerqi xieerqi 0 1月 16 08:40 named.pipe|
$ wc -c named.pipe
15 named.pipe
[1] + Done echo "This is a test" >named.pipe
নিয়মিত ফাইলগুলির জন্য আকারটি সমান হওয়া উচিত।
বিন্দু ls -l
এবং wc -c
, এবং কিভাবে তারা কাজ আলাদা। wc -c
আসলে পড়ার জন্য ফাইল খোলে (আপনি strace wc -c /etc/passwd
উদাহরণস্বরূপ চালনা করলে তা দেখতে পাবেন )। ls -l
কেবল stat()
তাদের উপর কল করে। এটি /proc
ls -l
0 আকারের শোতে কেন ব্যাখ্যা করে - আপনি এই ফাইলগুলি স্থিত করতে পারবেন না কারণ সেগুলি "আসল" নয় বা আসলে হার্ড-ড্রাইভ / এসএসডি-তে সংরক্ষিত নয়। wc -c
পরিবর্তে, ফাইলটির বিষয়বস্তু পড়ে এবং এর আকার গণনা করে।
অবশেষে, ls -l
ইন্টারেক্টিভভাবে আইটেম তালিকা করার জন্য কেবল একটি সরঞ্জাম। এটি স্ক্রিপ্টিংয়ের জন্য খুব কমই ভাল ফিট। যখন আপনাকে আসলে ডেটা পড়তে হবে, তার wc -c
পরিবর্তে ব্যবহার করুন।
দয়া করে নোট করুন, কোনও ফাইলের স্ক্রিপ্টিং এবং আকার নির্ধারণের জন্য, ls
সেরা প্রার্থী নয়। প্রকৃতপক্ষে, আউটপুট পার্সিং এড়াতেls
এটি অন্যতম একটি সাধারণ অনুশীলন । du -b
কোনও ফাইলের আকার অনুসন্ধানের জন্য ব্যবহার করুন।
/sys/
, /proc/
, ইত্যাদি) হতে পারে প্রদান stat
যদি implementer তা চয়ন তথ্য। বেশিরভাগ সময়, এর জন্য বাধ্যতামূলক কারণ নেই, তাই এটি বাদ দেওয়া হয়। উদাহরণগুলির মধ্যে অন্তর্ভুক্ত রয়েছে /proc/kcore
যা অ্যাড্রেসযোগ্য কার্নেল মেমরির আকার হিসাবে প্রকাশিত (সাধারণত উপলব্ধ শারীরিক মেমরির চেয়ে অনেক বেশি)।
ls -l
ফাইল সিস্টেম দ্বারা রিপোর্ট করা ফাইলের আকারটি ফিরিয়ে দেবে।
wc -c
'প্রকৃত' আকার নির্ধারণ করতে ফাইলটি পড়ার চেষ্টা করবে। আমার পর্যবেক্ষণগুলি থেকে এটি প্রথমে শেষের দিকে চেষ্টা করার চেষ্টা করে দেখা যাচ্ছে এবং এটি যদি কাজ না করে তবে এটি পুরো ফাইলটি পড়বে, আকারটি যেমন যায় তেমন গণনা করে।
এটি দুটি সরঞ্জাম কী করে সে সম্পর্কে এটি একটি সরল বিবরণ, তবে এটি ফলাফলের জন্য বিভিন্ন সংক্রামিত দিকে পরিচালিত করে:
ls
নির্দিষ্ট ফাইল সিস্টেমের জন্য একটি ভুল আউটপুট দেবে। উদাহরণস্বরূপ, ভার্চুয়ালাইজড ফাইল সিস্টেমগুলি /proc
অনেকগুলি ফাইলের জন্য শূন্য আকারের প্রতিবেদন করবে কারণ এই "ফাইলগুলি" শারীরিকভাবে কোথাও সংরক্ষণ করা হয়নি; তারা সফ্টওয়্যার দ্বারা প্রয়োজনীয় হিসাবে উত্পাদিত হয়।
wc
পড়ার অনুমতি ব্যতীত ফাইলগুলির জন্য মোটেও কাজ করবে না, যেখানে ls
ডিরেক্টরিটি তালিকাভুক্ত করার জন্য কেবলমাত্র অনুমতি প্রয়োজন (তুলনা ls -l /etc/shadow
করুন wc -c /etc/shadow
)।
অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে, প্রতীকী লিঙ্কগুলির আচরণও আলাদা। যেহেতু wc
সেগুলি পড়ার চেষ্টা করে, এটি সেই ফাইলটি পড়া শেষ করে যেখানে সিমলিংক পয়েন্ট করে, যেখানে ls
কেবল ফাইল সিস্টেমটিকে অনুসন্ধান করা হয়, এটি প্রতীকী লিঙ্কটি নিজেই সংরক্ষণ করতে ব্যবহৃত আকারের প্রতিবেদন করবে।
আমি নিশ্চিত যে অন্যান্য পার্থক্য রয়েছে যা আমি এখনও ভাবিনি, তবে আমি ভেবেছিলাম যে আমি এই পার্থক্যের পিছনে মূল কারণ সম্পর্কে একটি স্পষ্ট এবং সরল ব্যাখ্যা দেব।
seek()
। এটি strace wc -l
বেশ কয়েকটি বড় ফাইল চালানোর পরে দেখা যাচ্ছে ।
একটি সাধারণ ফাইলের জন্য, ls এবং wc কল স্ট্যাটাস। যাইহোক, / proc বা / sys ফাইলের জন্য, ls 0 প্রদান করে তবে ডাব্লুসিটি একটি পৃথক নম্বর প্রদান করে:
$ ls -l /proc/modules
-r--r--r-- 1 root root 0 Jan 16 14:56 modules
^ this one
$ wc -c /proc/modules
7621 modules
এটি সম্ভবত কোনও বিশেষ ফাইল কিনা তা সন্ধান করার কিছু উপায়।
wc -c
আমার জন্য কমপক্ষে কল করে fstat
, তবে আপাতদৃষ্টিতে অন্যান্য উদ্দেশ্যে। এটি lseek
শেষের দিকে আইং দ্বারা ফাইলের দৈর্ঘ্য সন্ধান করে । ইভেন্টটি যখন এটি ত্রুটি ফেরায়, এটি read
সম্পূর্ণ ফাইল।