ফাইলগুলি তালিকাভুক্ত করে তাদের সংখ্যক লাইনের সংখ্যা অনুসারে বাছাই করা


32

ফাইলগুলিতে /group/book/four/wordযে রেখাগুলি রয়েছে সেগুলি সংখ্যার অনুসারে বাছাই করে আমি কীভাবে তালিকা করতে পারি ?

ls -l কমান্ড এগুলি নীচে তালিকাভুক্ত করে তবে সেগুলি সাজায় না


1
আপনি কি লাইন সংখ্যা দ্বারা তালিকাভুক্ত ফাইল চান, বা ফাইল বা উভয় লাইন সংখ্যা তালিকাভুক্ত? ls -lলাইনের সংখ্যা দেয় না ls -lSকিছু lsবাস্তবায়ন ( আকারে বিষয়বস্তুতে বাইট সংখ্যা হ্রাস) সহ ফাইল আকারে ফাইল সাজায়।
স্টাফেন চেজেলাস

উত্তর:


34

আপনার এই মত একটি কমান্ড ব্যবহার করা উচিত:

find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
  • find: আপনি যে পথে চান ফাইলের জন্য অনুসন্ধান করুন। আপনি যদি এটি পুনরাবৃত্তি করতে না চান এবং আপনার findবাস্তবায়ন এটি সমর্থন করে তবে -maxdepth 1আপনার -execবিকল্পের ঠিক আগে যোগ করা উচিত ।
  • exec: wc -lপ্রতিটি ফাইলের মধ্যে কমান্ড আদেশ দেয় ।
  • sort -rn: বিপরীত ক্রমে ফলাফলগুলিকে সাংখ্যিকভাবে বাছাই করুন। বৃহত্তর থেকে নিম্নে।

(এটি ধরে নিয়েছে যে ফাইলের নামগুলিতে নতুন লাইন অক্ষর নেই)।


মনে রাখবেন যে একাধিক ফাইল পাস করার সময় (বা কিছু প্রয়োগের সাথে, এটি পড়তে পারে এমন একাধিক ফাইল), wcএকটি totalলাইনও প্রিন্ট করবে , সুতরাং এখানে কেবল একটি ফাইল না থাকলে আপনি এক বা একাধিক "মোট" লাইন পাবেন । grep /এগুলি সরাতে আপনি পাইপ করতে পারেন।
স্টাফেন চেজেলাস

sortকমান্ডের কারণে upvote
ফ্রান্সিসকো

আমি কেবলমাত্র সর্বনিম্ন এক্স লাইনের ফাইল দেখানোর জন্য কীভাবে ফিল্টার করতে পারি (উদাহরণের জন্য এক্স = 0 লাইন বাদে)?
ম্যাট্রিক্স

11

অ রিকার্সিভ

সম্ভবত আপনার পুনরাবৃত্তির প্রয়োজন না হলে সবচেয়ে সহজ সংস্করণ:

wc -l /group/book/four/word/*|sort -n

wc-lপ্রতিটি (তবে লুকানো) ( *) এর অধীনে থাকা ফাইলগুলিতে লাইনগুলি (বিকল্প ) গণনা করে /group/book/four/word/এবং sortফলাফলটি (পাইপের মাধ্যমে |) সংখ্যাসূচকভাবে (বিকল্প -n) সাজান ।

রিকার্সিভ

কেউ এই উত্তরটি grep -rlcদমন করার আগে উল্লেখ করে একটি মন্তব্য করেছিলেন । প্রকৃতপক্ষে grepএকটি দুর্দান্ত বিকল্প, বিশেষত যদি আপনার পুনরাবৃত্তি প্রয়োজন:

grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2

ডিরেক্টরিতে (অপশন -c) পুনরাবৃত্তির সাথে (বিকল্প -r) লাইনগুলি মিলবে ( grep) '^', যা লাইনের শুরু ) গণনা করবে /group/book/four/word/। তারপরে আপনাকে কোলনটি একটি স্থান দ্বারা প্রতিস্থাপন করতে হবে, উদাহরণস্বরূপ ব্যবহার করে tr, সহায়তা করার জন্য sort, যা আপনি -nদ্বিতীয় কলামে (বিকল্প -k2) সংখ্যায় (বিকল্প ) বাছাই করতে চান ।

আপডেট: সম্ভাব্য সীমাবদ্ধতা এবং কীভাবে আপনি বাস্তবে পরিত্রাণ পেতে পারেন সে সম্পর্কে স্টিফেনের মন্তব্য দেখুন tr


3
grep -c .কমপক্ষে একটি বৈধ অক্ষরযুক্ত রেখাগুলি গণনা করে। grep -c '^'সমস্ত লাইন গণনা করতে ব্যবহার করুন (কিছু grepবাস্তবায়নের সাথে শেষ নিউলাইনের পরেও অনুসরণযোগ্য অক্ষর গণনা করা হবে )। নোট করুন যে সমস্ত grepবাস্তবায়ন একটি সমর্থন করে না -rএবং আচরণের ক্ষেত্রেও তারতম্য হয়। :স্থানগুলির জন্য আপনাকে (কোলন, অর্ধিকোলন নয়) অনুবাদ করার দরকার নেই sort। শুধু ব্যবহার -t:। নোট করুন যে ধরে নিয়েছে যে ফাইলের নামগুলিতে :খালি বা নিউলাইন অক্ষর নেই।
স্টাফেন চেজেলাস

1
আপনার পুনরাবৃত্ত সমাধান সমাধান পোস্ট করার জন্য ধন্যবাদ; wcআপনি যদি একাধিক পথ পাস করেন তবে আমি এ জাতীয় একটি সহজ কাজটি জানতাম না । ওয়াইল্ড কার্ড এবং পাইপের সাথে সেই কার্যকারিতাটি সংযুক্ত sortকরা সত্যিই পরিষ্কার।
কিউকম

7

সাথে zsh:

lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)

আমরা একটি নতুন বাছাই করা ফাংশনটি সংজ্ঞায়িত করি linesযা ফাইলে লাইনের সংখ্যার সাথে জবাব দেয়। এবং আমরা o+linesগ্লোব কোয়ালিফায়ার ব্যবহার করি যা একসাথে n( সংখ্যাসমূহের জন্য) একত্রিত করে , গ্লোব ফলাফলগুলি কীভাবে অর্ডার করা হয় তা নির্ধারণ করে। ( .কেবলমাত্র নিয়মিত ফাইলগুলি পরীক্ষা করতে যোগ করা হয়েছে)।

এটি ফাইলের নামগুলিতে লুকানো ফাইলগুলি (যেগুলির সাথে শুরু হয় .) বাদ দেওয়া হয় সেগুলি ছাড়া অন্য কোন অক্ষর থাকতে পারে সে সম্পর্কে কোনও ধারণা নেই । যোগ Dউল্লিখিত glob কোয়ালিফায়ার যদি আপনি তাদের পাশাপাশি চাই।


2
ওপিকে কেবল ট্যাগ করা হয়েছে bash...
l0b0

7
@ l0b0 এর অর্থ এই নয় যে পরবর্তী ব্যক্তির যাকে এর প্রয়োজন হবে তিনিও চালাবেন।
টেরডন

4

আপনি যে কোনও সাব-ডিরেক্টরিতে ফাইলগুলি চান তা নির্দিষ্ট করে না /group/book/four/wordfindJherran এর উত্তরে সমাধান সাবডিরেক্টরি মধ্যে নামা হবে। যদি এটি না চাওয়া হয় তবে এর পরিবর্তে শেলটি ব্যবহার করুন:

for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n

যদি আপনার ফাইলের নামগুলিতে নতুন লাইন থাকতে পারে তবে আপনি এর মতো কিছু ব্যবহার করতে পারেন:

for file in ./*; do 
    [ -f "$file" ] && 
        printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'

অবশেষে, আপনি যদি উপ-ডিরেক্টরিতে অবতরণ করতে চান তবে আপনি এটি bash4 বা তদূর্ধে ব্যবহার করতে পারেন :

shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n

নোট করুন যে bash৪.৩ এর পূর্ববর্তী সংস্করণগুলি পুনরাবৃত্তভাবে ডিরেক্টরি ট্রি (যেমন zsh'গুলি বা এর tcsh' ***/*) নামার সময় প্রতিলিঙ্কগুলি অনুসরণ করছিল ।

এছাড়াও, উপরের সমস্ত সমাধানগুলি লুকানো ফাইলগুলি উপেক্ষা করবে (যাদের নাম একটি দিয়ে শুরু হয় ., shopt -s dotglobতাদের অন্তর্ভুক্ত করার জন্য ব্যবহার করুন) এবং প্রতীকী লিঙ্কগুলির লাইন গণনাও অন্তর্ভুক্ত করা হবে (যা findপদ্ধতির কাছে আসবে না)।


নোট করুন যে ঝেরানের সমাধান থেকে অন্যান্য পার্থক্য হ'ল আপনারও নিয়মিত ফাইলগুলিতে সিমলিংক বিবেচনা করবে ( জিএনইউতে -xtype fবা *(-.)zsh এ) এবং লুকানো ফাইলগুলি বাদ দেবে।
স্টাফেন চেজেলাস

@ স্টাফেন চ্যাজেলাস ধন্যবাদ জানিয়েছে, কেন %luprintf? আমার স্মরণ হিসাবে, এর অর্থ দীর্ঘ স্বাক্ষরযুক্ত দশমিক, এটি কি সত্যিই প্রয়োজনীয়? সংখ্যাকে স্ট্রিং হিসাবে ব্যবহার করবেন না কেন? এটা কি কোন পার্থক্য তৈরি করছে?
টেরডন

2
যদি ডাব্লিউসি আউটপুট খালি থাকে (উদাহরণস্বরূপ ফাইলটি পঠনযোগ্য নয়) তবে 0খালি স্ট্রিংয়ের পরিবর্তে এটি প্রসারিত হবে যা কিছুটা ভাল। কিছু সাজানো প্রয়োগগুলি স্বাক্ষরিত স্বাক্ষরযুক্ত ইন্টিজারের সাথে কাজ করে। %luসুরক্ষিত বেটের মতো শোনাচ্ছে তবে আপনার 2^31লাইন রয়েছে বলে মনে হয় এটি কোনও ব্যাপার নয় , যাইহোক এটি বয়সগুলি গ্রহণ করবে will
স্টাফেন চেজেলাস

1

আপনি যদি fdমরিচায় লেখা একটি খুব দ্রুত ফাইল সন্ধানকারী ইনস্টল করতে চান (আপনার এটি ইনস্টল করা উচিত, যাইহোক এটি দুর্দান্ত)

fd --type=file . | xargs wc -l | sort -n

মূলত fdফাইলগুলি তালিকাভুক্ত করে, xargs ফাইলগুলির তালিকাটি পাস করবে wc(শব্দের গণনার জন্য দাঁড়ায় তবে পাসিং -L এটি লাইন গণনা করবে) তারপরে অবশেষে এটি সর্বনিম্ন সংখ্যার লাইন থেকে বৃহত্তর ব্যবহার করে সাজানো হবে sort -n

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