ফাইলের নামের সাথে ফাইলের আকার মুদ্রণের জন্য কীভাবে আমি ফাইন্ড কমান্ড পাব?


106

যদি আমি নীচে ফাইন্ড কমান্ডটি ইস্যু করি:

$ find . -name *.ear

এটি মুদ্রণ করে:

./dir1/dir2/earFile1.ear
./dir1/dir2/earFile2.ear
./dir1/dir3/earFile1.ear

কমান্ড লাইনে আমি কী 'মুদ্রণ' করতে চাই তা হল নাম এবং আকার:

./dir1/dir2/earFile1.ear  5000 KB
./dir1/dir2/earFile2.ear  5400 KB
./dir1/dir3/earFile1.ear  5400 KB

উত্তর:


109
find . -name '*.ear' -exec ls -lh {} \;

jer.drab.org এর উত্তর থেকে কেবলমাত্র অতিরিক্ত। মানসিকভাবে এমবিতে রূপান্তর করার সময় সাশ্রয় করে;)


8
এই সংস্করণটি প্রতিটি ফাইলের জন্য "ls" প্রক্রিয়া সম্পাদন করবে। আপনি অনেক ফাইল (বলুন, এক হাজার বেশি) আপনি ভাল অপ্টিমাইজ থাকে যে হয় দ্বারা: find . -name '*.ear' -exec ls -lh {} + \;(গনুহ এক্সটেনশন) অথবা find . -name '*.ear' -print0 | xargs -0 ls -lh। এছাড়াও আপনি -type fকেবল ফাইলগুলিতে আগ্রহী হলে (অথবা -dআপনি যদি ডিরেক্টরিগুলি তাদের বিষয়বস্তু ব্যতীত নিজেরাই অন্তর্ভুক্ত করতে চান তবে যোগ করুন) যুক্ত করতে পছন্দ করতে পারেন।
ash108

2
আপনার উত্তর ডিরেক্টরিগুলি বাদ দেয় না, সুতরাং আপনি ডিরেক্টরিতে ls চালিয়ে যাবেন, যা স্পষ্টতই সঠিক জিনিস নয়।
ফাহিম মিঠা

2
এটি জিনিসগুলি করার একটি সত্যই অদক্ষ উপায় - এবং দুর্ভাগ্যক্রমে as1010 এর মন্তব্যগুলিও আদর্শ নয়। এটি সন্ধানের জন্য প্রিন্টফ বিকল্পটি ব্যবহার করা আরও ভাল।
ওস্কর পিয়ারসন

দমাজোনির উত্তরটি আরও কার্যকর কারণ এটি প্রতিটি ফাইলের জন্য একটি কাঁটাচামচ + এক্সিকিউট এড়িয়ে যায় (আমার মেশিনে 100x দ্রুত)। আমাকে% কে% s তে পরিবর্তন করতে হয়েছিল। @ ফাহিমমিঠা: আপনি -type fকেবল নিয়মিত ফাইল গণনা করার মতো বিকল্প যুক্ত করতে পারেন ।
মিঃ ফুজ

@ ফাহিমমিঠ সহজ সমাধান find . -name "*.ear" -type fফাইলগুলির জন্য। -type dডিরেক্টরি জন্য কাজ করে।
anon58192932

111

আপনাকে এক্সেক্স বা -প্রিন্টফ ব্যবহার করতে হবে। প্রিন্টফ এর মতো কাজ করে:

find . -name *.ear -printf "%p %k KB\n"

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

[সম্পাদনা] -প্রিন্টফ অফিসিয়াল পসিক্স স্ট্যান্ডার্ডে নেই, সুতরাং এটি আপনার সংস্করণে সমর্থিত কিনা তা পরীক্ষা করুন। তবে, বেশিরভাগ আধুনিক সিস্টেমগুলি জিএনইউ অনুসন্ধান বা অনুরূপ প্রসারিত সংস্করণ ব্যবহার করবে, সুতরাং এটি কার্যকর করার খুব ভাল সম্ভাবনা রয়েছে।


দেখে মনে হচ্ছে আপনার উদাহরণটি আরও সুনির্দিষ্ট, তবে সোলারিস 10 এ কাজ করার উদাহরণটি আমি পেতে পারি না
ব্রায়ান

আমি ভীত সোলারিস কোনওভাবেই- প্রিন্টফ সমর্থন করে না: jrwren.wrenfam.com/blog/2006/10/07/solaris-find-sks cs.bgu.ac.il/~arik/usail/man/solaris/ Find.1.html আপনি উদ্বিগ্ন হতে পারেন কিনা তা আপনি GNU টি ইনস্টল করতে পারেন, অন্যথায় আপনাকে এক্সিকিউটিভ বা | ব্যবহার করতে হবে অন্যদের পরামর্শ হিসাবে
লেইগ

1
এটি আরও পরিষ্কার বলে মনে হচ্ছে। আউটপুট ফর্ম্যাট করতে আমি অ্যাড columnকমান্ড পছন্দ করব । find . -name *.ear -printf "%p %k KB\n" | column -t
আমোল

1
এই উত্তরটি গৃহীত উত্তর চেয়ে এটা করতে অনেক সঠিক উপায়
ভয় প্রদর্শন করিয়া

2
-printfবিকল্প OS X এর পারেন মধ্যে কাজ করে না। স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 752818/ … দেখুন ।
abeboparebop

33

একটি সহজ সমাধান অনুসন্ধানে -l বিকল্প ব্যবহার করা হয়:

find . -name \*.ear -ls

এটি আপনাকে সাধারণ "ls -l" ফর্ম্যাটে প্রতিটি এন্ট্রি দেয়। অথবা, আপনি যে সুনির্দিষ্ট আউটপুটটি সন্ধান করছেন বলে মনে করছেন, এটি:

find . -name \*.ear -printf "%p\t%k KB\n"

যা আপনাকে কেবিতে আকারের পরে ফাইলের নাম দেবে।


এমনকি কোনও lsবিকল্প সম্পর্কেও জানতেন না , উত্তরগুলির তালিকার তুলনায় এটি আরও বেশি হওয়া উচিত।
প্রমিথিউস

24

Gnu find ব্যবহার করে আমার মনে হয় আপনি যা চান এটি এটি। এটি সমস্ত আসল ফাইল খুঁজে পায় এবং ডিরেক্টরিগুলি (-type f) নয় এবং প্রত্যেকের জন্য ফাইলের নাম (% p), একটি ট্যাব (\ t), কিলোবাইটের আকার (% কে), "কেবি" প্রত্যয় এবং তারপরে প্রিন্ট করে একটি নতুন লাইন (\ n)।

find . -type f -printf '%p\t%k KB\n'

যদি প্রিন্টফ কমান্ড জিনিসগুলি আপনার পছন্দ মতো ফর্ম্যাট না করে তবে আপনি এক্সেক ব্যবহার করতে পারেন এবং প্রতিটি ফাইলের মধ্যে যে আদেশটি প্রয়োগ করতে চান তা অনুসরণ করতে পারেন। ফাইলনামের জন্য {Use ব্যবহার করুন, এবং একটি অর্ধবৃত্ত (;) দিয়ে কমান্ডটি সমাপ্ত করুন। বেশিরভাগ গোলাগুলিতে, এই তিনটি চরিত্রকেই ব্যাকস্ল্যাশ দিয়ে পালাতে হবে।

এখানে একটি সহজ সমাধান যা "ls-lh" ব্যবহার করে তাদের খুঁজে বের করে মুদ্রণ করে, যা আপনাকে মানব-পঠনযোগ্য ফর্মের আকার (কিলোবাইটের জন্য এম, মেগাবাইটের জন্য এম) প্রদর্শন করবে:

find . -type f -exec ls -lh \{\} \;

অন্য একটি বিকল্প হিসাবে, "wc -c" ফাইলটিতে অক্ষরের সংখ্যা (বাইট) মুদ্রণ করবে:

find . -type f -exec wc -c \{\} \;

+1 -name '*.ear'উদাহরণগুলিতে বাদ দেওয়া ব্যতীত , এটি # 1 উত্তর হওয়া উচিত। এটি প্রশ্নের সঠিকভাবে উত্তর দেয়, বাক্য গঠনটির অর্থ ব্যাখ্যা করে এবং একাধিক বিকল্প দেয়।
ওসাকা ওয়েবেবি

এই উত্তরটি গ্রহণযোগ্য হওয়া উচিত কারণ এটি প্রতিটি লাইনের জন্য নতুন কমান্ড চালায় না, সুতরাং এটি বর্তমানে
শ্যাম

প্রকৃতপক্ষে এটি সঠিক উত্তর হওয়া উচিত। এছাড়াও, find . -type f -printf '%k KB\t %p\n'অর্থাত্ প্রথমে ফাইলের আকার মুদ্রণ করা, প্রান্তিককরণের কারণে সম্ভবত ফরম্যাটের ক্ষেত্রে আরও ভাল আউটপুট হবে।
myradio

8
find . -name '*.ear' -exec du -h {} \;

এটি আপনাকে সমস্ত অপ্রয়োজনীয় জিনিসগুলির পরিবর্তে কেবল ফাইলাইজ দেয়।


wcএটির জন্য আরও ভাল কাজ করে, যদি আপনার বাইটগুলির আকার প্রয়োজন হয়।
অ্যালেক্স

4

প্রশ্নকর্তা যা জিজ্ঞাসা করেছেন, ঠিক সেইভাবে দিতে আউক আউটপুট ঠিক করতে পারে। আমার সোলারিস 10 সিস্টেমে, -s দ্বিতীয় ক্ষেত্র হিসাবে কেবিতে আকার মুদ্রণ করে, তাই:

% find . -name '*.ear' -ls | awk '{print $2, $11}'
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir2/earFile3.ear
5400 ./dir1/dir2/earFile1.ear

অন্যথায়, -exec ls -lh ব্যবহার করুন এবং আউটপুট থেকে আকারের ক্ষেত্রটি বেছে নিন। আবার সোলারিস 10 এ:

% find . -name '*.ear' -exec ls -lh {} \; | awk '{print $5, $9}'
5.3M ./dir1/dir2/earFile2.ear
5.3M ./dir1/dir2/earFile3.ear
5.3M ./dir1/dir2/earFile1.ear

4

দু-এ ব্যবহার করবেন না কেন ? যেমন

find . -name "*.ear" -exec du -a {} \;

একটি ম্যাক কাজ করে


3

আমি ম্যাক ওএস এক্সে এটি নিয়ে লড়াই করেছি যেখানে ফাইন্ড কমান্ড সমর্থন করে না -printf

একটি সমাধান যা আমি পেয়েছি, যা স্বীকৃতভাবে সমস্ত গ্রুপের 'কর্মী' হওয়ার জন্য 'গ্রুপ' এর উপর নির্ভর করে ...

ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'

এই ls দীর্ঘ আউটপুট তিন টোকেন মধ্যে বিভক্ত

  1. পাঠ্য 'স্টাফ' এর আগে স্টাফ
  2. ফাইল আকার
  3. ফাইলের নাম

এবং তারপরে টোকেনগুলি 2 এবং 3 কে আউটপুট দেয়, আউটপুটটি বাইট সংখ্যা এবং তারপরে ফাইলের নাম

8071 sections.php
54681 services.php
37961 style.css
13260 thumb.php
70951 workshops.php

1
জেনে রাখা কার্যকর .. এর জিএনইউ সংস্করণ findbrew install findutils
হোমব্রিউয়ের

2

এটি আপনি যা সন্ধান করছেন তা পাওয়া উচিত, ফর্ম্যাটিং অন্তর্ভুক্ত (অর্থাত্ ফাইলের নাম প্রথমে এবং পরে আকার):

find . -type f -iname "*.ear" -exec du -ah {} \; | awk '{print $2"\t", $1}'

নমুনা আউটপুট (যেখানে আমি -iname "*.php"কিছু ফলাফল পেয়েছি ):

./plugins/bat/class.bat.inc.php  20K
./plugins/quotas/class.quotas.inc.php    8.0K
./plugins/dmraid/class.dmraid.inc.php    8.0K
./plugins/updatenotifier/class.updatenotifier.inc.php    4.0K
./index.php      4.0K
./config.php     12K
./includes/mb/class.hwsensors.inc.php    8.0K

1

আপনি এটি চেষ্টা করতে পারেন:

find. -name *.ear -exec du {} \;

এটি আপনাকে বাইটগুলিতে আকার দেবে। তবে du কমান্ড কেবি এবং এমবি-এম-এর জন্য প্যারামিটারগুলিও গ্রহণ করে। এটি আপনাকে একটি আউটপুট দেবে

5000  ./dir1/dir2/earFile1.ear
5400  ./dir1/dir2/earFile2.ear
5400  ./dir1/dir3/earFile1.ear



1

নিম্নলিখিত কমান্ড ব্যবহার করে দেখুন:

জিএনইউ stat:

find . -type f -name *.ear -exec stat -c "%n %s" {} ';'

বিএসডি stat:

find . -type f -name *.ear -exec stat -f "%N %z" {} ';'

তবে statমানসম্মত নয়, তাই duবা wcআরও ভাল পদ্ধতির হতে পারে:

find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';'


0

আপনার যদি মোট আকারের প্রয়োজন হয় তবে এখানে একটি স্ক্রিপ্ট প্রস্তাব দেওয়া আছে

#!/bin/bash
totalSize=0

allSizes=`find . -type f -name *.ear -exec stat -c "%s" {} \;`

for fileSize in $allSizes; do
    totalSize=`echo "$(($totalSize+$fileSize))"`
done
echo "Total size is $totalSize bytes"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.