প্রতিটি উপ ডিরেক্টরি ডিরেক্টরি ফাইল


22

আমি একটি বেসের কমান্ডটি ডিরেক্টরিগুলির প্রতিটি উপ ডিরেক্টরিতে ফাইলের গণনা কেবল তালিকাভুক্ত করতে চাই।

ডিরেক্টরির মধ্যে যেমন /tmpআছেন dir1, dir2... আমি দেখতে চাই:

`dir1` : x files 
`dir2` : x files ...

উত্তর:


33

ধরে নিই যে আপনি কেবল ফাইলের ডিরেক্টরি এবং অন্যান্য ধরণের ক্ষেত্রেই পুনরাবৃত্ত গণনা চান, এর মতো কিছু কাজ করা উচিত:

find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
  printf "%-25.25s : " "$dir"
  find "$dir" -type f | wc -l
done

এছাড়াও, আমি "সন্ধান করুন: সতর্কতা পেয়েছি: আপনি একটি অ-বিকল্প যুক্তি-টাইপের পরে -maxdepth বিকল্পটি নির্দিষ্ট করেছেন, তবে বিকল্পগুলি অবস্থানগত নয় (-ম্যাক্সডেপথ এটির আগে নির্দিষ্ট করা পরীক্ষাগুলি এবং তার পরে নির্দিষ্ট করাগুলিকে প্রভাবিত করে) দয়া করে বিকল্পগুলি নির্দিষ্ট করুন অন্যান্য যুক্তির আগে। "
jldupont

2
এখনও অবধি দেওয়া উভয় উত্তরই অসম্ভব ক্ষেত্রে ভুল ফলাফল দেয় যে এমন ফাইল রয়েছে যার নামগুলিতে নিউলাইন অক্ষর অন্তর্ভুক্ত রয়েছে। আপনি একটি সঙ্গে যে সব ব্যবস্থা করতে সক্ষম find... -print0 | xargs -0....
স্কট

@ জালদুপন্ট: argu-টাইপ ডি এর আগে গভীরতার তর্কগুলি সরান, আমি উত্তরটি সম্পাদনা করেছি।
থোর

হ্যাঁ, এবং আমাকে তথ্য যুক্ত করতে দিন যে এই দুর্দান্ত সমাধানটি কোনও বাহ্যিক ভেরিয়েবল গ্রহণ করবে না এবং এভাবে কাজ করবে bash alias!!
সিনট্যাক্সেরর

দ্রুত এবং পাইপিংয়ের মাধ্যমে sort -rn -k 2,2 -t$':'আপনি ডিইএসসি তালিকা পান
আন্দ্রে ফিগুয়েরেদো

14

এই কাজটি আমাকে এতটাই মুগ্ধ করেছিল যে আমি নিজেই একটি সমাধান বের করতে চেয়েছিলাম। এমনকি এটি লুপ এবং মায় কিছু সময় নেয় না দ্রুত সঞ্চালনের গতি হতে। বলা বাহুল্য, থোরের প্রচেষ্টা আমাকে বিষয়গুলি বিস্তারিতভাবে বুঝতে সাহায্য করেছে।

সুতরাং এখানে আমার:

find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "{} : $(find "{}" -type f | wc -l)" file\(s\)' \;

এটি কোনও কারণে পরিমিত দেখায় কারণ এটি দেখতে এটির চেয়ে আরও শক্তিশালী। :-)

তবে, আপনার .bash_aliasesফাইলটিতে এটি অন্তর্ভুক্ত করার পরিকল্পনা করা উচিত, এটি অবশ্যই দেখতে হবে:

alias somealias='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c '\''echo "{} : $(find "{}" -type f | wc -l)" file\(s\)'\'' \;'

নেস্টেড একক উদ্ধৃতিগুলির মধ্যে খুব কৌতুকপূর্ণ হ্যান্ডলিং নোট করুন । এবং না, যুক্তির জন্য ডাবল উদ্ধৃতি ব্যবহার করা সম্ভব নয়sh -c


এটি প্রতিটি ডিরেক্টরিতে / বিন / এসকে ডাকার সাথে সাথে এটি ধীর হয়। আপনি এটি দিয়ে পরীক্ষা করতে পারেন strace -fc script। আপনার সংস্করণ প্রায় 70% আরও বেশি সিস্টেম কল করে। খাটো কোড :-) +1 টি
থর

1
এটি দ্বারা অনুপ্রাণিত; ফাইলকাউন্ট অনুসারে বাছাই করা হয়েছে:find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "$(find "{}" -type f | wc -l)" {}' \; | sort -nr
mnagel

7
find . -type f | cut -d"/" -f2 | uniq -c

নীচে পাওয়া ফাইলগুলির একটি গণনা সহ বর্তমান ফোল্ডারে একটি ফোল্ডার এবং ফাইলগুলি তালিকাবদ্ধ করে। দ্রুত এবং দরকারী আইএমও। (ফাইলগুলি গণনা 1 দিয়ে দেখায়)।


1
এটি কীভাবে কাজ করছে তার একটু ব্যাখ্যা সম্পর্কে কীভাবে? :)
C0deDaedalus

1
অান্তরিক ধন্যবাদ! আপনি | sort -rnফাইলের সংখ্যা অনুসারে সাবডিয়ারগুলি বাছাই করতে চাইবেন।
ডেনিস গোলোমাজভ

1

আপনি যদি পুনরাবৃত্তভাবে গণনা করতে চান তবে সন্ধানের ব্যবহারটি অবশ্যই নিশ্চিতভাবেই চলতে পারে তবে আপনি যদি কেবল একটি নির্দিষ্ট ডিরেক্টরিতে কেবল ফাইলের একটি গণনা চান:

ls dir1 | wc -l


আমি সেখানে যে 1000 টি ডিরেক্টরি পেয়েছি তার প্রত্যেকটির জন্য আমি এটি করতে চাই না ...
jldupont

তারপরে xargs ব্যবহার করুন। ls -d */ | xargs -n1 ls | wc -l(আপনি যদি উত্তরটি ইতিমধ্যে কার্যকর হয় তবে এটি ব্যবহার করুন, যদিও এটি ঠিক এবং এখন আপনি জানেন))
jrajav

আপনার প্রস্তাবটি বেশ কয়েক সেকেন্ডে কোনও ফলাফল দেখায় নি যখন আমি উত্তরটি গ্রহণ করেছি।
jldupont

@ জরাজভ এই পদ্ধতির মধ্যে সাদা স্থান সহ ডিরেক্টরিগুলির জন্য একেবারে ব্যর্থ। এ কারণেই findএটি এত গুরুত্বপূর্ণ। (একা থাকুন -print0এবং xargs -0অন্যান্য জবাব ইতিমধ্যে স্কট দ্বারা নির্দেশিত)
সিনট্যাক্সারর

1
find . -mindepth 1 -type d -print0 | xargs -0 -I{} sh -c 'printf "%4d : %s\n" "$(find {} -type f | wc -l)" "{}"'

আমার প্রায়শই আমার সাব ডিরেক্টরি ডিরেক্টরিতে ফাইল সংখ্যা গণনা এবং এই কমান্ডটি ব্যবহার করা প্রয়োজন। আমি গণনাটিকে প্রথমে উপস্থিত হতে পছন্দ করি।


0

আমি যা ব্যবহার করি ... এটি প্যারামিটার হিসাবে আপনি যা দিয়েছেন তার মধ্যে সমস্ত উপ-ডিরেক্টরিগুলির একটি অ্যারে তৈরি করে। সমস্ত উপ-ডিরেক্টরি প্রক্রিয়া না করা পর্যন্ত সাব-ডাইরেক্টরি এবং সেই একই উপ-ডিরেক্টরিটির গণনা মুদ্রণ করুন।

#!/bin/bash    
directories=($(/bin/ls -l $1 | /bin/grep "^d" | /usr/bin/awk -F" " '{print $9}'))

for item in ${directories[*]}
    do
        if [ -d "$1$item" ]; then
            echo "$1$item"
            /bin/ls $1$item | /usr/bin/wc -l
        fi
    done

0

আপনি এই অজগর কোডটি ব্যবহার করতে পারেন। দম্পতি চালনা করে এটি চালিয়ে দিন python3:

folder_path = '.'
import os, glob
for folder in sorted(glob.glob('{}/*'.format(folder_path))):
    print('{:}: {:>8,}'.format(os.path.split(folder)[-1], len(glob.glob('{}/*'.format(folder)))))

বা নেস্টেড গণনাগুলির জন্য একটি পুনরাবৃত্ত সংস্করণ:

import os, glob
def nested_count(folder_path, level=0):
    for folder in sorted(glob.glob('{}/'.format(os.path.join(folder_path, '*')))):
        print('{:}{:}: {:,}'.format('    '*level, os.path.split(os.path.split(folder)[-2])[-1], len(glob.glob(os.path.join(folder, '*')))))
        nested_count(folder, level+1)
nested_count('.')

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

>>> figures: 5
>>> misc: 1
>>> notebooks: 5
>>>     archive: 65
>>>     html: 12
>>>     py: 12
>>>     src: 14
>>> reports: 1
>>>     content: 6
>>> src: 1
>>>     html_download: 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.