একটি ডিরেক্টরিতে সমস্ত ফাইলের সামগ্রীর মোট আকার [বন্ধ]


103

আমি যখন ব্যবহার করি lsবা du, আমি প্রতিটি ফাইল অধিগ্রহণ করে এমন পরিমাণের ডিস্কের স্থান পাই।

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


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

3
মনে রাখবেন যে duএই প্রশ্নের উত্তর দেওয়ার জন্য ব্যবহার করা যাবে না। এটি ডিরেক্টরিতে ডিস্কের যে পরিমাণ ডিস্ক স্থান দখল করে তা দেখায় (ফাইলগুলির ডেটা এবং সহায়ক ফাইল সিস্টেম মেটা-তথ্যের আকার)। duআউটপুট সমস্ত ফাইল মোট আকার চেয়ে আরও ছোট হতে পারবেন না। ফাইল সিস্টেম যদি ডিস্কে সংক্ষেপিত ডেটা সঞ্চয় করতে পারে বা হার্ড লিঙ্কগুলি ব্যবহার করা হয় তবে এটি ঘটতে পারে। সঠিক উত্তরের উপর ভিত্তি করে lsএবং find। এখানে নেলসনের দ্বারা এবং বাইটপেন দ্বারা উত্তরগুলি দেখুন বা এই উত্তর: unix.stackexchange.com/a/471061/152606
anton_rh

উত্তর:


108

আপনি 'আপাত মাপ' চান, না আকার ডিস্কের ফাইলের দ্বারা গৃহীত আপ ব্যবহার (যে প্রতিটি ফাইল বাইট সংখ্যা লিখুন) -bবা --bytesবিকল্প (যদি আপনি গনুহ সঙ্গে একটি Linux সিস্টেম আছে coreutils ):

% du -sbh <directory>

1
দুর্ভাগ্যক্রমে আমার এমবেডড দেব বাক্সে নয়, আমার নতুন লাল টুপি বাক্সগুলিতে কাজ করে।
আর্থার উলফেল্ট

3
মানব-পঠনযোগ্য ফর্ম্যাটে "আপাত আকার" দেখানোর সহজ উপায় কী আছে? যখন ব্যবহার du -shb(এই উত্তর দ্বারা প্রস্তাবিত), -bসেটিং ওভাররাইড বলে মনে হয় -hসেটিং।
ম্যাথিয়াস বাইনেন্স

6
@ ম্যাথিয়াসবাইনেন্স ফ্ল্যাগগুলির ক্রমকে বিপরীত করুন (যেমন ডু-এসএসবি <ডিরি>)। আমার জন্য কাজ কর.
লুইস ই

2
@ ম্যাথিয়াসবাইনেন্সdu -sh --apparent-size /dir/
জঙ্গোসি

2
@ আরক্যাডি আমি আপনার সমাধানটি সেন্টোস এবং উবুন্টুতে চেষ্টা করে দেখেছি এবং একটি ছোট্ট ত্রুটি রয়েছে। আপনি "du -sbh" চান। "-H" পতাকাটি অবশ্যই শেষ অবধি আসতে হবে।
দ্য জলিসিন

46

ব্যবহার du -sb:

du -sb DIR

বিকল্পভাবে, hআরও ব্যবহারকারী-বান্ধব আউটপুট জন্য বিকল্প যুক্ত করুন :

du -sbh DIR

4
-b মনে হচ্ছে ম্যাকোসের 'ডু
লিনাক্সয়েড

3
@lynxoid: আপনি চোলাই সঙ্গে গনুহ সংস্করণ ইনস্টল করতে পারেন: brew install coreutils। এটি কমান্ড হিসাবে উপলব্ধ হবে gdu
neu242

1
কাজ করে না. ls-> file.gz hardlink-to-file.gzstat -c %s file.gz-> 9657212stat -c %s hardlink-to-file.gz-> 9657212du -sb-> 9661308। এটি অবশ্যই সামগ্রীর মোট আকার নয় তবে ডিরেক্টরিটি ডিস্কে ধারণ করে।
অ্যান্টন_আরহ

24

সিডি ডিরেক্টরিতে, তারপর:

du -sh

FTW!

মূলত এটি সম্পর্কে এখানে লিখেছেন: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/


1
এটি সহজ এবং কাজ করে! ধন্যবাদ। কখনও কখনও, আমি -Lবিকল্প যুক্ত করতে চাই তাই duসিমলিঙ্কগুলি অনুসরণ করে।
conradkleinespel

2
আমার জন্য কাজ করে (ওএস এক্সে)
সাম বুসালিস

2
এটি সহজ এবং কাজ করে না। এটি ডিরেক্টরিটি ডিস্কে যে স্থানটি নিয়ে যায় তা মুদ্রণ করে, প্রতিটি ফাইল খোলার মাধ্যমে এবং বাইটগুলি গণনা করে গণনা করা যায় এমন সামগ্রীর মোট আকার নয়।
অ্যান্টন_আরহ

17

কেবল একটি বিকল্প:

ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'

grep -v '^d' ডিরেক্টরিগুলি বাদ দেবে।


4
নিখুঁত, "লুকানো ফাইলগুলি" (কোনও সময়ের সাথে শুরু হওয়া কিছু) পেতে -a পরম যোগ করুন
নিকলি এইপ্রিল

নির্দিষ্ট ফাইলের ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
ধরণে

এটি একটি সঠিক উত্তর। duএই সমাধানটির বিপরীতে ফাইলগুলির সমস্ত ডেটার মোট আকারকে গণনা করা হয় যেন সেগুলি একে একে খোলা হয় এবং তাদের বাইটগুলি গণনা করা হয়। তবে হ্যাঁ, -Aলুকানো ফাইলগুলিও গণনা করার জন্য প্যারামিটার যুক্ত করা দরকার।
অ্যান্টন_আরহ

13

স্ট্যাটের "% s" ফর্ম্যাট আপনাকে কোনও ফাইলে বাইটের প্রকৃত সংখ্যা দেয়।

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

সংখ্যার সংমিশ্রণের জন্য আপনার পছন্দের পদ্ধতিটি নির্বিঘ্নে নির্ধারণ করুন


4
নির্দিষ্ট ফাইলের নাম (ফাঁকা স্থান ইত্যাদি) নিয়ে সমস্যা এড়াতে সাধারণত "Find। -Type f -prin0 | xargs -0 ..." ব্যবহার করুন।
hlovdal

1
হ্যাঁ, ভাল পয়েন্ট। এটি বিএসডি না থাকলে 2.২ আমি এটি ব্যবহার করতে মনে করি না :-(
নেলসন

3
find -print0এবং xargs -0স্পেস সহ ফাইলের নামের প্রয়োজন। ওএস এক্স চায় stat -f %z
কর্নেল

1
(নোট করুন যে স্ট্যাটটি স্পার্স ফাইলগুলির সাথে কাজ করে, ফাইলের বড় নামমাত্র আকারের প্রতিবেদন করে এবং ডিস্কে duরিপোর্টের মতো ছোট ব্লক ব্যবহার করে না ))
নেলসন

1
এখানে অন্যান্য অনেক উত্তরগুলির মতো নয় যা ভুলভাবে duইউটিলিটিটি ব্যবহার করে , এই উত্তরটি সঠিক। এটি এখানে উত্তর দেওয়ার মতোই অনুরূপ: unix.stackexchange.com/a/471061/152606 । তবে আমি সিমলিঙ্কগুলিও গণনা করার ! -type dপরিবর্তে ব্যবহার করব -type f(সিমলিংকের আকার নিজেই (সাধারণত কয়েকটি বাইট), এটি ফাইলটির আকার নয় যা এটি নির্দেশ করে)।
anton_rh

3

আপনি যদি এমবেডেড সিস্টেমে ব্যস্তবক্সের "ডু" ব্যবহার করেন তবে আপনি ডু সহ একটি সঠিক বাইট পেতে পারবেন না, কেবল কেবাইটেসই পাবেন।

BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary

Usage: du [-aHLdclsxhmk] [FILE]...

Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.

Options:
        -a      Show sizes of files in addition to directories
        -H      Follow symbolic links that are FILE command line args
        -L      Follow all symbolic links encountered
        -d N    Limit output to directories (and files with -a) of depth < N
        -c      Output a grand total
        -l      Count sizes many times if hard linked
        -s      Display only a total for each argument
        -x      Skip directories on different filesystems
        -h      Print sizes in human readable format (e.g., 1K 243M 2G )
        -m      Print sizes in megabytes
        -k      Print sizes in kilobytes(default)

3

যখন কোনও ফোল্ডার তৈরি করা হয়, তখন অনেকগুলি লিনাক্স ফাইল সিস্টেমগুলি ডিরেক্টরি সম্পর্কে কিছু মেটাডেটা সঞ্চয় করতে 4096 বাইট বরাদ্দ করে। ডিরেক্টরিটি বড় হওয়ার সাথে সাথে এই স্থানটি 4096 বাইটের একাধিক দ্বারা বৃদ্ধি করা হয়েছে।

du কমান্ড (-b বিকল্পের সাথে বা ছাড়াই) এই স্থানটি গণনা করুন , আপনি টাইপ করতে দেখতে পাচ্ছেন:

mkdir test && du -b test

খালি দিরের জন্য আপনার ফল 4096 বাইট হবে। সুতরাং, আপনি যদি 10000 বাইটের 2 টি ফাইল দির ভিতরে রাখেন তবে du -sb দ্বারা প্রদত্ত মোট পরিমাণ তবে 24096 বাইট হবে।

আপনি যদি মনোযোগ সহকারে প্রশ্নটি পড়েন তবে এটিই জিজ্ঞাসা করে না। প্রশ্নকারী জিজ্ঞাসা করলেন:

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

উপরের উদাহরণে 20000 বাইট হওয়া উচিত, 24096 নয়।

সুতরাং, সঠিক উত্তর আইএমএইচও হ'ল ফাঁকযুক্ত ফাইলের নামগুলি হ্যান্ডেল করার জন্য নেলসন উত্তর এবং হ্লোভডাল পরামর্শের মিশ্রণ হতে পারে :

find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'

2

উইন্ডোজের জন্য লিনাক্স / ইউনিক্স এবং গিট ব্যাশ উভয় ক্ষেত্রেই কাজ করা বাইটগুলিতে "ফাইল এবং উপ-ডিরেক্টরিতে সমস্ত ডেটার সংখ্যার সমষ্টি" পাওয়ার জন্য কমপক্ষে তিনটি উপায় রয়েছে যা নীচে দ্রুততম থেকে গড় থেকে ধীর হয়ে যাওয়ার জন্য নীচে তালিকাবদ্ধ রয়েছে। আপনার রেফারেন্সের জন্য, তারা মোটামুটি গভীর ফাইল সিস্টেমের মূলে সম্পাদন করা হয়েছিল ( docroot30,027 ডিরেক্টরিতে 71,158 ফাইল সমন্বিত একটি ম্যাজেন্টো 2 এন্টারপ্রাইজ ইনস্টলেশনতে)।

1।

$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes

real    0m0.221s
user    0m0.068s
sys     0m0.160s

2।

$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes

real    0m0.256s
user    0m0.164s
sys     0m0.196s

3।

$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes

real    0m0.553s
user    0m0.308s
sys     0m0.416s


এই দু'টিও কাজ করে, তবে উইন্ডোজের জন্য গিট বাশে নেই এমন কমান্ডগুলির উপর তারা নির্ভর করে:

1।

$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes

real    0m0.233s
user    0m0.116s
sys     0m0.176s

2।

$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes

real    0m0.242s
user    0m0.104s
sys     0m0.152s


আপনি যদি কেবল বর্তমান ডিরেক্টরিটির জন্য মোট চান, তবে এতে যুক্ত -maxdepth 1করুন find


মনে রাখবেন যে প্রস্তাবিত সমাধানগুলির মধ্যে কিছু সঠিক ফলাফল দেয় না, তাই আমি পরিবর্তে উপরের সমাধানগুলিতে আটকে থাকব।

$ du -sbh
832M    .

$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525

$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471

$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133

1
উইন্ডোজের জন্য গিট বাশ সম্পর্কে, - সাইগউইনের ক্ষেত্রে dcএটি bcপ্যাকেজের অংশ , সুতরাং এটি পেতেdc এটি ইনস্টল করা প্রয়োজন bc
রুভিম

1

উইন 32 ডসের জন্য, আপনি এটি করতে পারেন:

সি:> দির / এসসি: \ ডিরেক্টরি \ আপনি চান

এবং পেনাল্টিমেট লাইন আপনাকে জানায় যে ফাইলগুলি কতগুলি বাইট নেয়।

আমি জানি যে এটি সমস্ত ফাইল এবং ডিরেক্টরি পড়ে, তবে কিছু পরিস্থিতিতে দ্রুত কাজ করে।


1

duসুবিধাজনক, তবে findআপনি যদি কয়েকটি ফাইলের আকার গণনা করতে চান তবে দরকারী (উদাহরণস্বরূপ, এক্সটেনশন দ্বারা ফিল্টার ব্যবহার করা)। এছাড়াও নোট করুন যে findতারা নিজেরাই প্রতিটি ফাইলের আকার বাইটে মুদ্রণ করতে পারে। মোট আকার গণনা করতে আমরা dcনিম্নলিখিত পদ্ধতিতে কমান্ডটি সংযুক্ত করতে পারি :

find . -type f -printf "%s + " | dc -e0 -f- -ep

এখানে পছন্দ মত findকমান্ডের ক্রম উত্পন্ন । যদিও, সমাপ্ত প্রোগ্রামটি হওয়া উচিতdc123 + 456 + 11 +0 123 + 456 + 11 + p (পোস্টফিক্স স্বরলিপি মনে রাখবেন)।

সুতরাং, সমাপ্ত প্রোগ্রামটি পেতে আমাদের 0স্টিডিনের ক্রম নির্বাহের আগে স্ট্যাক লাগাতে হবে এবং কার্যকর করার পরে শীর্ষ সংখ্যাটি মুদ্রণ করতে হবে (শেষে pকমান্ডটি)। আমরা এটি dcবিকল্পের মাধ্যমে অর্জন করি :

  1. -e0 শুধুমাত্র শর্টকাট জন্য -e '0' যে রাখে 0স্ট্যাক,
  2. -f- স্টিডিনের আদেশগুলি পড়ার এবং সম্পাদন করার জন্য (যা উত্পন্ন করে find এখানে ),
  3. -ep ফলাফল মুদ্রণের জন্য (-e 'p' )।

মাইবিতে আকারটি মুদ্রণের জন্য 284.06 MiBআমরা এর -e '2 k 1024 / 1024 / n [ MiB] p'পরিবর্তে পয়েন্ট 3-তে ব্যবহার করতে পারি (বেশিরভাগ স্থান optionচ্ছিক)


1

এটি সাহায্য করতে পারে:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'

উপরের কমান্ডটি ডিরেক্টরিগুলির আকার রেখে সমস্ত ফাইল যোগ করবে।


1
নোট করুন যে এই সমাধানটি বরুনের উত্তরের সাথে খুব মিল । তবে এই সমাধানটি উপ-ডিরেক্টরিগুলিতে ফাইলগুলি যোগ করে না।
রুভিম

1
@ আরভিম, এটি লুকানো ফাইলগুলিরও যোগ করে না। লুকানো ফাইলগুলি -Aযোগ করতে বিকল্পটি অবশ্যই যুক্ত করতে হবে ls
অ্যান্টন_আরহ

0

ব্যবহার করুন:

$ du -ckx <DIR> | grep total | awk '{print $1}'

<dir> ডিরেক্টরিটি যেখানে আপনি পরিদর্শন করতে চান is

'-C' আপনাকে গ্র্যান্ড টোটাল ডেটা দেয় যা কমান্ডের 'গ্রেপ টোটাল' অংশটি ব্যবহার করে বের করা হয় এবং কেবিটিস-এ গণনাটি awk কমান্ডের সাহায্যে বের করা হয়।

এখানে কেবলমাত্র সাবধানতাটি যদি আপনার কাছে "মোট" পাঠ্য সহ একটি উপ-ডিরেক্টরি থাকে তবে এটিও থুথু ফেলবে।

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