একটি ফোল্ডার শ্রেণিবিন্যাসে আমি আলাদা আলাদা ফাইল এক্সটেনশনগুলি কীভাবে খুঁজে পাব?


235

একটি লিনাক্স মেশিনে আমি একটি ফোল্ডার শ্রেণিবিন্যাসকে অতিক্রম করতে এবং এর মধ্যে পৃথক সমস্ত ফাইল এক্সটেনশনের একটি তালিকা পেতে চাই।

শেল থেকে এটি অর্জনের সর্বোত্তম উপায় কী হবে?

উত্তর:


347

এটি চেষ্টা করুন (এটি সর্বোত্তম উপায় কিনা তা নিশ্চিত নয়) তবে এটি কার্যকর হয়):

find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u

এটি নিম্নলিখিত হিসাবে কাজ করে:

  • বর্তমান ফোল্ডার থেকে সমস্ত ফাইল সন্ধান করুন
  • ফাইলগুলির এক্সটেনশন প্রিন্ট করে যদি থাকে
  • একটি অনন্য বাছাই করা তালিকা তৈরি করুন

8
কেবলমাত্র রেফারেন্সের জন্য: আপনি যদি কিছু ডিরেক্টরি অনুসন্ধান (যেমন .svn) থেকে বাদ দিতে চান তবে find . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u উত্সটি
ডেনিস গোলোমাজভ

স্পেসগুলি কোনও পার্থক্য করবে না। প্রতিটি ফাইলের নাম পৃথক লাইনে থাকবে, সুতরাং ফাইল তালিকার ডিলিমিটারটি "\ n" স্থান নয়।
ইভান নেভোস্ট্রুভ

1
উইন্ডোজে, এটি আরও ভাল কাজ করে এবং এটির চেয়ে অনেক দ্রুত: dir / s / b | পার্ল - 'মুদ্রণ করুন $ 1 যদি m /\.( ^^^^^^^^^^\\\\\\\\++)$/' | বাছাই করুন
রায়ান শিলিংটন


8
একটি প্রকরণ, এটি এক্সটেনশন প্রতি গণনা সহ তালিকাটি দেখায়:find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
marcovtwout

54

পাইপের দরকার নেই sort, অ্যাডক সব কিছু করতে পারে:

find . -type f | awk -F. '!a[$NF]++{print $NF}'

আমি এটি একটি উপাধিকার হিসাবে কাজ করতে পাচ্ছি না, আমি বিদ্রূপ পাচ্ছি: উত্স লাইনের 1 প্রসঙ্গে সিনট্যাক্স ত্রুটি >>>! এ [] <<< বিশ্রী: সোর্স লাইনে জামিন দেওয়া 1 আমি কী ভুল করছি? আমার উপন্যাসটি এইরকম সংজ্ঞায়িত করা হয়েছে: ওরফে ফাইল_সেক্সট = "সন্ধান করুন--প্রকার-এফ-নাম ' ' | অজক-এফ । '! একটি [$ এনএফ] ++ {প্রিন্ট করুন
F

2
@ ইউজার 2602152 সমস্যাটি হ'ল আপনি aliasকমান্ডের উদ্ধৃতি সহ পুরো ওয়ান-লাইনারকে ঘিরে চেষ্টা করছেন তবে কমান্ড নিজেই ফাইন্ড কমান্ডে উদ্ধৃতি ব্যবহার করেছে । এটি ঠিক করার জন্য আমি bashএর আক্ষরিক স্ট্রিং সিনট্যাক্সটি ব্যবহার করব :alias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
সিজেএক্সএক্স

যদি কোনও সাবডিরের একটি থাকে তবে এটি কাজ করে না। এটির নামে এবং ফাইলটির ফাইলের এক্সটেনশন নেই। উদাহরণ: আমরা যখন মাইন্ডির থেকে রান করব তখন এটি ব্যর্থ হবেmaindir/test.dir/myfile
নেলসন

1
@ নেলসনটিক্সিরা 'ফাইন্ড -printf "%f\n"' কমান্ডের শেষে যুক্ত করুন এবং আপনার পরীক্ষাটি আবার চালান।
সিজেএক্সএক্স

41

পুনরাবৃত্ত সংস্করণ:

find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u

আপনি যদি মোট চান (কিভাবে বারের মতো এক্সটেনশনটি দেখা হয়েছিল):

find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn

অ-পুনরাবৃত্ত (একক ফোল্ডার):

for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u

আমি এই ফোরাম পোস্ট উপর ভিত্তি করে করেছি , ক্রেডিট সেখানে যেতে হবে।


গ্রেট! আমার গিট দৃশ্যের জন্যও কাজ করে, শেষ প্রতিশ্রুতিতে আমি কোন ধরণের ফাইল ছুঁয়েছি তা বের করার চেষ্টা করছিলাম:git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
ভ্যালকেন রেভেন

30

শক্তির উৎস:

dir -recurse | select-object extension -unique

আপনাকে ধন্যবাদ http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html


20
ওপি "অন লিনাক্স মেশিনে"
বলেছিল

9
আসলে এখন লিনাক্সের জন্য প্রওয়ারশেল রয়েছে: github.com/Mic Microsoft
KIC

4
যেমন লেখা আছে, এটি সেই ডিরেক্টরিগুলিও বেছে নেবে যাগুলির .মধ্যে একটি রয়েছে (যেমন আউটপুট jquery-1.3.4হিসাবে প্রদর্শিত হবে .4)। dir -file -recurse | select-object extension -uniqueকেবলমাত্র ফাইল এক্সটেনশানগুলি পেতে পরিবর্তন করুন।
এমসিডব্লিউ

1
@ ফোর্বসেমিস্টার: উইন্ডোজযুক্ত ব্যক্তিরা (আমার মতো) এই প্রশ্নটি দেখতে পাবেন। সুতরাং এটি দরকারী।
রোল

1
পাওয়ারশেল উত্তরের জন্য ধন্যবাদ। ব্যবহারকারীরা কীভাবে অনুসন্ধান করে তা আপনি ধরে নিবেন না। প্রচুর লোক কোনও কারণে উপকৃত হয়েছিল
মহেশ

20

আমার অ্যাজ-কম, সিড-কম, পার্ল-কম, পাইথন-কম পসিক্স-কমপ্লায়েন্ট বিকল্প:

find . -type f | rev | cut -d. -f1 | rev  | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn

কৌশলটি হ'ল এটি লাইনটি উল্টায় এবং শুরুতে এক্সটেনশনটি কেটে দেয়।
এটি এক্সটেনশানগুলিকে লোয়ার কেসে রূপান্তর করে।

উদাহরণ আউটপুট:

   3689 jpg
   1036 png
    610 mp4
     90 webm
     90 mkv
     57 mov
     12 avi
     10 txt
      3 zip
      2 ogv
      1 xcf
      1 trashinfo
      1 sh
      1 m4v
      1 jpeg
      1 ini
      1 gqv
      1 gcs
      1 dv

ম্যাক অন, uniqপুরো পতাকা নেই --count, কিন্তু -cঠিক কাজ করে
ওয়ার্ক

12

বিন্দুর সাহায্যে এরিথিন খুঁজুন এবং কেবল প্রত্যয়টি দেখান show

find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u

যদি আপনি জানেন তবে সমস্ত প্রত্যয়টির 3 টি অক্ষর রয়েছে

find . -type f -name "*.???" | awk -F. '{print $NF}' | sort -u

বা সেড সহ এক থেকে চারটি অক্ষরের সাথে সমস্ত প্রত্যয় দেখায়। আপনি প্রত্যয়টির প্রত্যাশা করছেন এমন অক্ষরের পরিসীমাটিতে {1,4 Change পরিবর্তন করুন।

find . -type f | sed -n 's/.*\.\(.\{1,4\}\)$/\1/p'| sort -u

1
পাইপকে 'সাজানোর' দরকার নেই, বিশ্রী সবকিছুই এটি করতে পারে: সন্ধান করুন। -প্রকার চ-নাম " " | awk -F। '! a [$ NF] ++ {প্রিন্ট করুন $ NF}'
সিয়েজএক্স

@ সিজএক্সএক্স আপনার পৃথক উত্তর হওয়া উচিত। এটি বড় ফোল্ডারগুলির জন্য সবচেয়ে ভাল কাজ করার জন্য এই কমান্ডটি খুঁজে পেয়েছিল, এটি এটি এক্সটেনশানগুলি যেমন এটি আবিষ্কার করে তেমনি মুদ্রণ করে। তবে মনে রাখবেন এটি হওয়া উচিত: -নাম " "
রাল্ফ

@ রালফ সম্পন্ন, উত্তর পোস্ট এখানে । আপনি -name "."জিনিসটির অর্থ কী তা সম্পর্কে পুরোপুরি নিশ্চিত নন কারণ এটি ইতিমধ্যে এটি
সিজেএক্সএক্স

আমি বোঝাতে চাইছি এটির নাম "*। *" হওয়া উচিত, তবে স্ট্যাকওভারফ্লো * অক্ষরগুলি সরিয়ে দেয়, যা সম্ভবত আপনার মন্তব্যেও ঘটেছে।
রাল্ফ

দেখে মনে হচ্ছে এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, অর্ড কম্যান্ড-লাইন সরঞ্জাম হিসাবে পার্ল করা ভাল and
জন z

7

মিশ্রণটিতে আমার নিজস্ব প্রকরণটি যুক্ত করা হচ্ছে। আমি মনে করি এটি অনেকটা সহজ এবং দক্ষতা যখন বড় উদ্বেগ না হয় তখন এটি কার্যকর হতে পারে।

find . -type f | grep -o -E '\.[^\.]+$' | sort -u

1
বহনযোগ্যতার জন্য +1, যদিও রেজেক্সটি বেশ সীমাবদ্ধ, কারণ এটি কেবলমাত্র একটি অক্ষরের সমন্বিত এক্সটেনশনের সাথে মেলে। গৃহীত উত্তর থেকে রেজেক্স ব্যবহার করা আরও ভাল বলে মনে হচ্ছে:$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
এমমন্টু

1
একমত। আমি সেখানে কিছুটা পিছলে পড়েছি। আপনি যে ভুলটি চিহ্নিত করেছেন তা সংশোধন করতে আমার উত্তর সম্পাদনা করা হচ্ছে।
gkb0986

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

5

পাইথনে খালি এক্সটেনশান সহ খুব বড় ডিরেক্টরিগুলির জন্য জেনারেটর ব্যবহার করে এবং প্রতিটি এক্সটেনশানটি প্রদর্শিত হওয়ার সময় পাওয়া:

import json
import collections
import itertools
import os

root = '/home/andres'
files = itertools.chain.from_iterable((
    files for _,_,files in os.walk(root)
    ))
counter = collections.Counter(
    (os.path.splitext(file_)[1] for file_ in files)
)
print json.dumps(counter, indent=2)

5

আমি এখানে কয়েকটি উত্তর, এমনকি "সেরা" উত্তর চেষ্টা করেছি। আমি বিশেষত যা পরেছিলাম সেগুলি সম্পর্কে তারা সকলেই সংক্ষেপে এসেছিল। সুতরাং একাধিক প্রোগ্রামের জন্য রেজেক্স কোডে বসে 12 ঘন্টা ছাড়াও এবং এই উত্তরগুলি পড়া এবং পরীক্ষা করার জন্য এটি আমি এসেছি যা আমার মতো ঠিক কাজ করে।

 find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
  • এক্সটেনশন থাকতে পারে এমন সমস্ত ফাইল সন্ধান করে।
  • কেবল এক্সটেনশনকে শুভেচ্ছা জানায়
  • 2 থেকে 16 টি অক্ষরের মধ্যে ফাইল এক্সটেনশনের জন্য গ্রেপস (কেবলমাত্র তারা আপনার প্রয়োজনের সাথে মানানসই সংখ্যাগুলি সামঞ্জস্য করুন)। এটি ক্যাশে ফাইল এবং সিস্টেম ফাইলগুলি এড়াতে সহায়তা করে (জেল অনুসন্ধানের জন্য সিস্টেম ফাইল বিট)।
  • কম ক্ষেত্রে এক্সটেনশানগুলি মুদ্রণের জন্য জব।
  • বাছাই এবং শুধুমাত্র অনন্য মান আনুন। মূলত আমি বিশ্রী উত্তরটি চেষ্টা করার চেষ্টা করেছি তবে এটি সংবেদনশীলতায় বিভিন্ন আইটেম মুদ্রণ করবে।

আপনার যদি ফাইল এক্সটেনশনের একটি গণনা প্রয়োজন তবে নীচের কোডটি ব্যবহার করুন

find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn

যদিও এই পদ্ধতিগুলি সম্পূর্ণ হতে কিছুটা সময় নেবে এবং সম্ভবত সমস্যাটি সমাধানের সর্বোত্তম উপায় নয়, তারা কাজ করে।

আপডেট: @ @ alpha_989 লম্বা ফাইল এক্সটেনশনের ফলে সমস্যার কারণ হবে। এটি আসল রেজেক্স "" [[: আলফা:]] {3,6} "এর কারণে। আমি "[[: আলফা:]] {2,16}" রেজেক্স অন্তর্ভুক্ত করার জন্য উত্তর আপডেট করেছি। তবে এই কোডটি ব্যবহার করা যে কোনও ব্যক্তিকে সচেতন হওয়া উচিত যে এই সংখ্যাগুলি নূন্যতম এবং চূড়ান্ত আউটপুটটির জন্য এক্সটেনশনের অনুমতি কত মিনিটের সর্বাধিক। এই ব্যাপ্তির বাইরের যে কোনও কিছুই আউটপুটে একাধিক লাইনে বিভক্ত হবে।

দ্রষ্টব্য: মূল পোস্টটি পড়েছিল "- 3 থেকে 6 টি অক্ষরের মধ্যে ফাইল এক্সটেনশনের জন্য গ্রেপস (কেবলমাত্র তারা আপনার প্রয়োজনের সাথে ফিট না করে তবে সংখ্যাগুলি সামঞ্জস্য করুন) এটি ক্যাশে ফাইল এবং সিস্টেম ফাইলগুলি এড়াতে সহায়তা করে (সিস্টেম ফাইল বিটটি জেল সন্ধান করতে হবে)) "

আইডিয়া: এর মাধ্যমে নির্দিষ্ট দৈর্ঘ্যের উপরের ফাইল এক্সটেনশনগুলি খুঁজে পেতে ব্যবহার করা যেতে পারে:

 find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk '{print tolower($0)}' | sort -u

যেখানে 4 ফাইলের এক্সটেনশনের দৈর্ঘ্য অন্তর্ভুক্ত করা যায় এবং তারপরে সেই দৈর্ঘ্যের বাইরে কোনও এক্সটেনশনও খুঁজে পান।


গণনা সংস্করণ পুনরাবৃত্তি?
ফার্নান্দো মন্টোয়া

@ শিনরাই, সাধারণভাবে ভাল কাজ করে। তবে আপনার যদি কিছু এলোমেলো ফাইল এক্সটেনশন থাকে যা সত্যই দীর্ঘ ডাউনলোডের মতো .ডাউনলোড হয় তবে এটি ".ডাউনলোড" কে 2 ভাগে বিভক্ত করবে এবং 2 টি ফাইলের একটি "ডাউনলো" এবং অন্যটি "বিজ্ঞাপন"
রিপোর্ট করবে আলফা_989

@ alpha_989, এটি "রেজেক্সের কারণে হয়েছে [[: alpha:]] {3,6}" এছাড়াও 3 টি অক্ষরের চেয়ে কম এক্সটেনশন নিয়ে সমস্যা সৃষ্টি করবে। আপনার যা প্রয়োজন তা সামঞ্জস্য করুন। ব্যক্তিগতভাবে আমি বলতে চাই 2,16 বেশিরভাগ ক্ষেত্রে কাজ করা উচিত।
শিনরাই

জবাব দেওয়ার জন্য ধন্যবাদ .. হ্যাঁ .. পরে যা বুঝতে পেরেছি তা বোঝায়। আপনি যা উল্লেখ করেছেন তার সাথে আমি এটি সংশোধন করার পরে এটি ভাল কাজ করেছে।
alpha_989

3

যেহেতু পার্ল ব্যবহার করে ইতিমধ্যে অন্য একটি সমাধান রয়েছে:

যদি আপনি পাইথন ইনস্টল করেন তবে আপনি এটি করতেও পারেন (শেল থেকে):

python -c "import os;e=set();[[e.add(os.path.splitext(f)[-1]) for f in fn]for _,_,fn in os.walk('/home')];print '\n'.join(e)"

2

এখন পর্যন্ত কোনও উত্তরই নিউলাইনগুলি সহ ফাইলের নামগুলি সঠিকভাবে মোকাবেলা করে নি (ক্রিস্টোফিডের বাদে, যা আমি টাইপ করার সাথে সাথে এসেছি)। নিম্নলিখিতটি শেল ওয়ান-লাইনার নয়, তবে কাজ করে এবং যুক্তিসঙ্গতভাবে দ্রুত।

import os, sys

def names(roots):
    for root in roots:
        for a, b, basenames in os.walk(root):
            for basename in basenames:
                yield basename

sufs = set(os.path.splitext(x)[1] for x in names(sys.argv[1:]))
for suf in sufs:
    if suf:
        print suf

2

আমি মনে করি না এটির এখনও উল্লেখ করা হয়েছিল:

find . -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c

এটি প্রতিটি ফাইলের জন্য একটি নতুন প্রক্রিয়া তৈরির কারণে সম্ভবত বেশ ধীর হবে।
ওন্দ্রা Žižka

1

আমি মনে করি সবচেয়ে সহজ এবং সোজা উপায়

for f in *.*; do echo "${f##*.}"; done | sort -u

এটি ক্রিস্টোফিডের তৃতীয় পথে সংশোধিত।


0

আপনি এটি করতে পারে

find . -type f -name "*.php" -exec PATHTOAPP {} +

0

আমি এটি সহজ এবং দ্রুত খুঁজে পেয়েছি ...

   # find . -type f -exec basename {} \; | awk -F"." '{print $NF}' > /tmp/outfile.txt
   # cat /tmp/outfile.txt | sort | uniq -c| sort -n > tmp/outfile_sorted.txt

0

গৃহীত উত্তরটি আরইজিএক্স ব্যবহার করে এবং আপনি আরইজিএক্সের সাথে একটি উলাম কমান্ড তৈরি করতে পারবেন না, আপনাকে এটি একটি শেল স্ক্রিপ্টে রাখতে হবে, আমি অ্যামাজন লিনাক্স 2 ব্যবহার করছি এবং নিম্নলিখিতটি করলাম:

  1. আমি এই ফাইলটি ব্যবহার করে গৃহীত উত্তর কোডটি রেখেছি:

    sudo vim find.sh

এই কোড যুক্ত করুন:

find ./ -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u

টাইপ করে ফাইলটি সংরক্ষণ করুন: :wq!

  1. sudo vim ~/.bash_profile

  2. alias getext=". /path/to/your/find.sh"

  3. :wq!

  4. . ~/.bash_profile

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