“Wc -c <র্যান্ডম ফাইল>” এর তুলনায় “ls -l <র্যান্ডম ফাইল>” এর বাইট গণনা


25

কোন সম্ভাব্য পরিস্থিতি আছে যখন

ls -l file.txt

বাইট হিসাবে একই সংখ্যা দেখাচ্ছে না

wc -c file.txt

একটি স্ক্রিপ্টে আমি সেই দুটি মানের তুলনা পেয়েছি। এর কারণ কী হতে পারে? একই ফাইলটির বিভিন্ন বাইট সংখ্যা থাকাও কি সম্ভব?


2
আপনি খুঁজে পাওয়া এই স্ক্রিপ্ট কিছু প্রসঙ্গ দিতে পারেন?
কুসালানন্দ

উত্তর:


13

হ্যাঁ, এরকম কেস রয়েছে।

ক্ষেত্রে symlinks গনুহ সাথে Linux সিস্টেমে ls, ls -lলিংক আকার আউট করা হবে, যখন wc -cপ্রকৃত ফাইল সমাধান এবং সেখানে বাইটের সংখ্যা পড়বে। নীচে আপনি দেখতে পারেন যে ls -l29 বাইট 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 -l0 আকারের শোতে কেন ব্যাখ্যা করে - আপনি এই ফাইলগুলি স্থিত করতে পারবেন না কারণ সেগুলি "আসল" নয় বা আসলে হার্ড-ড্রাইভ / এসএসডি-তে সংরক্ষিত নয়। wc -cপরিবর্তে, ফাইলটির বিষয়বস্তু পড়ে এবং এর আকার গণনা করে।

অবশেষে, ls -lইন্টারেক্টিভভাবে আইটেম তালিকা করার জন্য কেবল একটি সরঞ্জাম। এটি স্ক্রিপ্টিংয়ের জন্য খুব কমই ভাল ফিট। যখন আপনাকে আসলে ডেটা পড়তে হবে, তার wc -cপরিবর্তে ব্যবহার করুন।

দয়া করে নোট করুন, কোনও ফাইলের স্ক্রিপ্টিং এবং আকার নির্ধারণের জন্য, lsসেরা প্রার্থী নয়। প্রকৃতপক্ষে, আউটপুট পার্সিং এড়াতেls এটি অন্যতম একটি সাধারণ অনুশীলন । du -b কোনও ফাইলের আকার অনুসন্ধানের জন্য ব্যবহার করুন।


1
একটি ছোট শোধন - ভার্চুয়াল ফাইল (মধ্যে /sys/, /proc/, ইত্যাদি) হতে পারে প্রদান statযদি implementer তা চয়ন তথ্য। বেশিরভাগ সময়, এর জন্য বাধ্যতামূলক কারণ নেই, তাই এটি বাদ দেওয়া হয়। উদাহরণগুলির মধ্যে অন্তর্ভুক্ত রয়েছে /proc/kcoreযা অ্যাড্রেসযোগ্য কার্নেল মেমরির আকার হিসাবে প্রকাশিত (সাধারণত উপলব্ধ শারীরিক মেমরির চেয়ে অনেক বেশি)।
টবি স্পিড

11

ls -l ফাইল সিস্টেম দ্বারা রিপোর্ট করা ফাইলের আকারটি ফিরিয়ে দেবে।

wc -c'প্রকৃত' আকার নির্ধারণ করতে ফাইলটি পড়ার চেষ্টা করবে। আমার পর্যবেক্ষণগুলি থেকে এটি প্রথমে শেষের দিকে চেষ্টা করার চেষ্টা করে দেখা যাচ্ছে এবং এটি যদি কাজ না করে তবে এটি পুরো ফাইলটি পড়বে, আকারটি যেমন যায় তেমন গণনা করে।

এটি দুটি সরঞ্জাম কী করে সে সম্পর্কে এটি একটি সরল বিবরণ, তবে এটি ফলাফলের জন্য বিভিন্ন সংক্রামিত দিকে পরিচালিত করে:

lsনির্দিষ্ট ফাইল সিস্টেমের জন্য একটি ভুল আউটপুট দেবে। উদাহরণস্বরূপ, ভার্চুয়ালাইজড ফাইল সিস্টেমগুলি /procঅনেকগুলি ফাইলের জন্য শূন্য আকারের প্রতিবেদন করবে কারণ এই "ফাইলগুলি" শারীরিকভাবে কোথাও সংরক্ষণ করা হয়নি; তারা সফ্টওয়্যার দ্বারা প্রয়োজনীয় হিসাবে উত্পাদিত হয়।

wcপড়ার অনুমতি ব্যতীত ফাইলগুলির জন্য মোটেও কাজ করবে না, যেখানে lsডিরেক্টরিটি তালিকাভুক্ত করার জন্য কেবলমাত্র অনুমতি প্রয়োজন (তুলনা ls -l /etc/shadowকরুন wc -c /etc/shadow)।

অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে, প্রতীকী লিঙ্কগুলির আচরণও আলাদা। যেহেতু wcসেগুলি পড়ার চেষ্টা করে, এটি সেই ফাইলটি পড়া শেষ করে যেখানে সিমলিংক পয়েন্ট করে, যেখানে lsকেবল ফাইল সিস্টেমটিকে অনুসন্ধান করা হয়, এটি প্রতীকী লিঙ্কটি নিজেই সংরক্ষণ করতে ব্যবহৃত আকারের প্রতিবেদন করবে।

আমি নিশ্চিত যে অন্যান্য পার্থক্য রয়েছে যা আমি এখনও ভাবিনি, তবে আমি ভেবেছিলাম যে আমি এই পার্থক্যের পিছনে মূল কারণ সম্পর্কে একটি স্পষ্ট এবং সরল ব্যাখ্যা দেব।


পড়ার অনুমতি উল্লেখ করার জন্য +1 এবং seek()। এটি strace wc -lবেশ কয়েকটি বড় ফাইল চালানোর পরে দেখা যাচ্ছে ।
সের্গেই কলডিয়াজন্য

আমার উত্তরের চেয়ে আরও বিশদ যুক্ত করার জন্য +1!
সাইক্লিক 3

6

একটি সাধারণ ফাইলের জন্য, 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

এটি সম্ভবত কোনও বিশেষ ফাইল কিনা তা সন্ধান করার কিছু উপায়।


2
wc -cআমার জন্য কমপক্ষে কল করে fstat, তবে আপাতদৃষ্টিতে অন্যান্য উদ্দেশ্যে। এটি lseekশেষের দিকে আইং দ্বারা ফাইলের দৈর্ঘ্য সন্ধান করে । ইভেন্টটি যখন এটি ত্রুটি ফেরায়, এটি readসম্পূর্ণ ফাইল।
মুজার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.