Than ls -l` আমার চেয়ে বেশি ফাইল গণনা করে কেন?


25

স্পষ্টতই আমি গণনা করতে পারি না। আমার মনে হয় এখানে তিনটি ফাইল রয়েছে/media

$ tree /media
/media
├── foo
├── onex
└── zanna
3 directories, 0 files

তবে, ls -l12 খুঁজে।

$ ls -l /media
total 12
drwxr-xr-x  2 root root 4096 Jul 31 20:57 foo
drwxrwxr-x  2 root root 4096 Jun 26 06:36 onex
drwxr-x---+ 2 root root 4096 Aug  7 21:17 zanna

এবং, আমি যদি করি তবে আমি ls -laকেবল .এবং ..উপরেরটি ছাড়াও পেতে পারি তবে গণনাটি হয়total 20

ব্যাখ্যা কি?

উত্তর:


33

12আপনি দেখতে ফাইলের সংখ্যা নয়, কিন্তু ডিস্ক ব্লক সংখ্যা পুড়িয়ে ফেলল।

থেকে info coreutils 'ls invocation':

 For each directory that is listed, preface the files with a line
 `total BLOCKS', where BLOCKS is the total disk allocation for all
 files in that directory.  The block size currently defaults to 1024
 bytes, but this can be overridden (*note Block size::).  The
 BLOCKS computed counts each hard link separately; this is arguably
 a deficiency.

12আপনি 20যখন দুটি অতিরিক্ত ডিরেক্টরি গণনা করছেন তার ls -laপরিবর্তে আপনি যখন ব্যবহার করবেন তখন মোটটি যায় ls -l: .এবং ..। আপনি প্রতিটি (খালি) ডিরেক্টরিতে চারটি ডিস্ক ব্লক ব্যবহার করছেন, সুতরাং আপনার মোটটি 3 × 4 থেকে 5 × 4 পর্যন্ত চলে গেছে (সমস্ত সম্ভাবনায় আপনি প্রতিটি ডিরেক্টরিতে 4096 বাইটের একটি ডিস্ক ব্লক ব্যবহার করছেন ; infoপৃষ্ঠাটি সূচিত করে, ইউটিলিটি ডিস্ক ফর্ম্যাটটি যাচাই করে না, তবে 1024অন্যথায় নির্দেশ না দিলে একটি ব্লকের আকার ধরে নেয় ))

আপনি যদি কেবল ফাইলের নম্বর পেতে চান তবে আপনি এর মতো কিছু চেষ্টা করতে পারেন

ls | wc -l

13
ls | wc -lযদি ফাইলনামে একটি নতুন লাইনযুক্ত ফাইল থাকে তবে ব্যর্থ হবে। এটি আরও স্থিতিস্থাপক:find . -mindepth 1 -maxdepth 1 -printf . | wc -c
ফ্লিম

20
"যদি ফাইলের নামগুলিতে তাদের মধ্যে একটি নতুন লাইন থাকে" ... কাঁপুন
পেটাহ

8
যেমনটি man lsআপনাকে বলবে, আপনি নিয়ন্ত্রণের অক্ষরগুলি এড়িয়ে যেতে পারবেন -b(সেগুলি থেকে পালিয়ে) বা -q(এগুলি বাদ দিয়ে)। সুতরাং গণনা করার জন্য, ls -1q | wc -lগোপনীয় ফাইলগুলি প্রদর্শনের জন্য নিরাপদ এবং নির্ভুল। ls -1qA | wc -lলুকানো ফাইলগুলি গণনা করতে (তবে নয় .এবং ..)। আমি এর -1পরিবর্তে ব্যবহার করছি -lকারণ এটি দ্রুত হওয়া উচিত।
অলি

18

user4556274 ইতিমধ্যে উত্তর দেওয়া হয়েছে কেন । আমার উত্তরটি কীভাবে ফাইলগুলি সঠিকভাবে গণনা করতে পারে তার জন্য অতিরিক্ত তথ্য সরবরাহ করে to

ইউনিক্স সম্প্রদায়ে সাধারণ sens কমত্য হল আউটপুট পার্স করা lsখুব খারাপ ধারণা , যেহেতু ফাইলের নামগুলিতে নিয়ন্ত্রণের অক্ষর বা লুকানো অক্ষর থাকতে পারে। উদাহরণস্বরূপ, একটি ফাইলনামে একটি নতুন লাইন চরিত্রের কারণে, আমরা ls | wc -lআমাদের জানিয়েছি যে আউটপুটটিতে 5 টি লাইন রয়েছে ls(এটি রয়েছে) তবে বাস্তবে ডিরেক্টরিতে কেবল 4 টি ফাইল রয়েছে।

$> touch  FILE$'\n'NAME                                                       
$> ls                                                                         
file1.txt  file2.txt  file3.txt  FILE?NAME
$> ls | wc -l
5

পদ্ধতি # 1: ইউটিলিটি সন্ধান করুন

findকমান্ড, যা সাধারণত কাজ করছে ফাইলের নামের পার্স জন্য ব্যবহৃত হয়, আমাদের এখানে মুদ্রণ করে সাহায্য করতে পারেন inode সংখ্যা । এটি ডিরেক্টরি বা একটি ফাইল হোন, এর কেবলমাত্র একটি অনন্য ইনড নম্বর রয়েছে। সুতরাং, ব্যবহার করে -printf "%i\n"এবং বাদ .দিয়ে -not -name "."আমাদের ফাইলগুলির একটি সঠিক গণনা থাকতে পারে। ( -maxdepth 1সাব-ডিরেক্টরিতে পুনরাবৃত্তির উত্থান প্রতিরোধের ব্যবহারের জন্য দ্রষ্টব্য )

$> find  -maxdepth 1 -not -name "." -print                                    
./file2.txt
./file1.txt
./FILE?NAME
./file3.txt
$> find  -maxdepth 1 -not -name "." -printf "%i\n" | wc -l                    
4

পদ্ধতি # 2: গ্লোবস্টার

সহজ, দ্রুত এবং বেশিরভাগ বহনযোগ্য উপায়:

$ set -- * 
$ echo $#
228

setকমান্ডটি শেলের অবস্থানগত পরামিতি নির্ধারণ করতে ব্যবহৃত হয় ( $<INTEGER>যেমন ভেরিয়েবলগুলি echo $1)। এটি প্রায়শই /bin/shঅ্যারের অভাব সীমাবদ্ধতার কাজ করতে ব্যবহৃত হয় । অতিরিক্ত চেক সম্পাদনা করে এমন একটি সংস্করণ ইউনিক্স এবং লিনাক্সের গিলির উত্তরে পাওয়া যাবে ।

অ্যারেগুলিকে সমর্থন করে এমন শেলগুলিতে যেমন bashআমরা ব্যবহার করতে পারি

items=( dir/* )
echo ${#items[@]}

মন্তব্যগুলিতে স্টিল্ড্রাইভার দ্বারা প্রস্তাবিত হিসাবে ।

findপদ্ধতিতে অনুরূপ কৌশল যা wcগ্লোবস্টারের সাথে statপ্রতি লাইনে ইনোড সংখ্যা গণনা করতে ব্যবহার করা যেতে পারে :

$> LC_ALL=C stat ./* --printf "%i\n" | wc -l                                          
4

বিকল্প বিকল্পটি forলুপে একটি ওয়াইল্ডকার্ড ব্যবহার করা । (দ্রষ্টব্য, এই পরীক্ষাটি সাব-ডিরেক্টরিতে নেমেছে কিনা তা পরীক্ষা করার জন্য এই পরীক্ষাটি আলাদা ডিরেক্টরি ব্যবহার করে, যা এটি না - 16 আমার আইটেমের যাচাই করা সংখ্যা ~/bin)

$> count=0; for item in ~/bin/* ; do count=$(($count+1)) ; echo $count ; done | tail -n 1                                
16

পদ্ধতি # 3: অন্যান্য ভাষা / দোভাষী

পাইথন আমার os.listdir()ফাংশন প্রদত্ত তালিকার দৈর্ঘ্যের মুদ্রণের মাধ্যমে সমস্যাযুক্ত ফাইলের নামগুলিও মোকাবেলা করতে পারে (যা পুনরাবৃত্তিযোগ্য নয় এবং কেবল যুক্তি হিসাবে দেওয়া ডিরেক্টরিতে আইটেমগুলি তালিকাভুক্ত করবে)।

$> python -c "import os ; print os.listdir('.')"                              
['file2.txt', 'file1.txt', 'FILE\nNAME', 'file3.txt']
$>  python -c "import os ; print(len(os.listdir('.')))"                    
4

আরো দেখুন


2
ব্যাশে, অন্য বিকল্পটি হ'ল একটি অ্যারে ব্যবহার করা হবে উদাহরণস্বরূপ items=( dir/* ); echo ${#items[@]}( shopt -s dotglobলুকানো ফাইলগুলি অন্তর্ভুক্ত করা)।
স্টিল্ড্রাইভার

1
মুদ্রণ inode সংখ্যার ফিল্টার hardlinks সহজ করে তোলে ইচ্ছা হলে, সঙ্গে find | sort -u | wc -l
পিটার কর্ডেস

@ স্টিলড্রাইভার: আমি মনে করি বাশ-অ্যারে পদ্ধতিটি দ্রুত হওয়ার সম্ভাবনা কম। আপনি যদি এটি পুনরাবৃত্ত হতে চান তবে আপনাকে ব্যবহার করতে হবে items=( dir/** )(সহ shopt -s globstar), তবে ব্যাশটি রেডডিয়ার থেকে অতিরিক্ত মেটাডেটার সুবিধা নেবে না, সুতরাং এটি প্রতিটি ডিরেক্টরি এন্ট্রিকে এটি ডিরেক্টরি ডিরেক্টরি কিনা তা পর্যালোচনা করে। অনেক ফাইল সিস্টেম ডিরেক্টরি টাইপ এ ফাইল টাইপ সংরক্ষণ করে তাই রিডডির ইনোড অ্যাক্সেস না করে এটিকে ফিরিয়ে দিতে পারে। (উদাহরণস্বরূপ সর্বশেষতম অ-ডিফল্ট এক্সএফএস এ রয়েছে, এবং আমি মনে করি ext4 এর বেশি দিন ধরে ছিল)) আপনি যদি straceখুঁজে পান তবে আপনি statস্ট্রেশিং ব্যাশের চেয়ে অনেক কম সিস্টেম কল দেখতে পাবেন ।
পিটার কর্ডস

2
শুধু ব্যবহার print(len(os.listdir('.')))করবেন না কেন ? টাইপ করার জন্য কম অক্ষর এবং দ্বিগুণ-আন্ডারকর্ডেড বৈশিষ্ট্যগুলি অ্যাক্সেস এড়িয়ে যাওয়া।
এডউইনকস্ল

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