বৃহত্তম ফাইল বা ডিরেক্টরিগুলি সন্ধান করুন


10

কোন কমান্ড টিএমপি ডিরেক্টরিতে সমস্ত ফাইল এবং ডিরেক্টরিগুলির আকার মুদ্রণ করবে (লুকিয়ে রয়েছে) এবং মানব পাঠযোগ্য বিন্যাসে (উদাহরণস্বরূপ 2 গিগাবাইট) বৃহত্তম থেকে ক্ষুদ্রতম পর্যন্ত মাপ অনুসারে বাছাই করবে?

আউটপুট নিম্নলিখিত হিসাবে হতে পারে:

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

আমি lsঅ্যান্ড duকমান্ডগুলি ব্যবহার করার চেষ্টা করেছি কিন্তু সঠিক স্যুইচগুলি সন্ধান করতে সক্ষম হয়েছি।

উত্তর:


7

এখানে একটি দ্রুত ফিক্স, du + সাজান ব্যবহার করুন। এটা চেষ্টা কর:

du -smc * | sort -n

এটি লুকানো ফাইলগুলিকে উপেক্ষা করবে, তবে এটি আর একটি সহজ সমাধান:

du -smc .[^.] .??* * | sort -n

উপরের এক বা একাধিক নিদর্শন যদি কোনও ফাইলের সাথে মেলে না তবে এটি সম্পর্কে সতর্কতা হতে পারে। প্রথম প্যাটার্নটি .[^.]শুরু হয়ে দুটি অক্ষরের ফাইলের সাথে মেলে। দ্বিতীয় প্যাটার্ন বাদে, .??*তিনটি অক্ষরের বা আরও বেশি ফাইল নাম দিয়ে শুরু করে। এবং * সমস্ত ফাইলের সাথে মেলে না যা শুরু হয়। আরও পরিশীলিত তালিকার জন্য যেমন একটি সম্পূর্ণ ফাইল সিস্টেমের জুড়ে এক্স এর চেয়েও বড় সমস্ত ফাইল সন্ধান করা, বা ফাইল সিস্টেমের বৃদ্ধির একটি তালিকা বজায় রাখার জন্য, আমার কিছু DIY শেল স্ক্রিপ্ট রয়েছে যা আমি লিখেছি এবং যদি আপনার আগ্রহী হয় তবে শেয়ার করতে পারি।


ধন্যবাদ. আমি আপনার স্ক্রিপ্টে আগ্রহী যদি আপনি এত দয়াবান হন।
xralf

1
sort -nrআপনি যদি শীর্ষে সর্বাধিক মান চান তবে ব্যবহার করুন ।
লরেন্সসি

3

/tmpআকারের অনুসারে বাছাই করা ফাইলের নীচে যে কোনও জায়গায় তালিকাবদ্ধ করতে:

find /tmp -type f -exec du -k {} + | sort -k1n -k2

/tmpমাপ অনুসারে বাছাই করা অবিলম্বে ফাইল এবং ডিরেক্টরি গাছগুলি তালিকাভুক্ত করতে :

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

/tmpআকার অনুসারে বাছাই করা যেকোনও অধীনে সমস্ত ফাইল এবং ডিরেক্টরি গাছগুলি তালিকাভুক্ত করতে :

du -ak /tmp | sort -k1n -k2

(তিনটি কমান্ডের মধ্যে পার্থক্য বোঝানোর জন্য একটি উদাহরণ: যদি কোনও ফাইল থাকে /tmp/dir/fileতবে প্রথম কমান্ডের তালিকা থাকে /tmp/dir/file, দ্বিতীয় তালিকা থাকে /tmp/dirএবং তৃতীয় তালিকাগুলি উভয়ই থাকে))

উপরের সমস্ত কমান্ড কিলোবাইটে মাপ দেখায়। যদিও জিএনইউ ডু "মানব-পঠনযোগ্য" আকারগুলি (কে, এম, জি, ইত্যাদি গুণিতক) আউটপুট দিতে পারে, তাদের বাছাই করা অন্য বিষয়। সাম্প্রতিক পর্যায়ে যথেষ্ট পরিমাণে জিএনইউ কোর্টিলগুলি (.47.4) এটি করতে পারে: কেবল du -kসাথে du -hএবং sort -k1n -k2সাথে প্রতিস্থাপন করুন sort -k1h -k2। অন্যথায়, এখানে প্রত্যয়যুক্ত আকারগুলিতে রূপান্তর করার জন্য একটি অশোধিত অ্যাভ স্ক্রিপ্ট রয়েছে (গোল করে নিচে); sortএটিতে উপরের আউটপুটটি কেবল পাইপ করুন ।

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'

ধন্যবাদ. এই কমান্ডগুলি দরকারী, তবে আমি কেবলমাত্র tmp এর অধীনে কেবল ফাইল এবং ডিরেক্টরিগুলিতে আগ্রহী, উপ-ডিরেক্টরিতে ফাইল নয়
xralf

1
@ এক্স্রাল্ফ: তারপরে কেবলমাত্র দ্বিতীয় ধরণের duকল ব্যবহার করুন।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

দেখতে দুর্দান্ত লাগছে, তবে ফোর্বস্যাক পোস্ট হিসাবে এমবি এবং জিবি দিয়ে আরও ভাল ফলাফল হয়।
xralf

3

আমি এটির জন্য নিম্নলিখিত নাম ব্যবহার করছি: alias ds='du -x --all --max-depth=1 . | sort -n'

এটি বর্তমান ফাইলের সমস্ত ফাইল এবং 1-স্তরের স্তরের সাব-ডাইরেক্টরিগুলি মুদ্রণ করে।


এটি দুর্দান্ত সংক্ষিপ্ত সমাধান, তবে এটি কেবল ডিরেক্টরিগুলি মুদ্রণ করে।
xralf

ওহ, দুঃখিত, আপনি ঠিক বলেছেন। আমি কখনও ফাইলগুলির সাথে এই সমস্যার মুখোমুখি হইনি। যাইহোক, আমি ফাইলগুলির সাথে এটি কীভাবে কাজ করতে হয় তা খুঁজে পেয়েছি: - সমস্ত সুইচ ব্যবহার করে।
rvs

দুর্দান্ত সঠিক সমাধান। পেঙ্গুইন 359 কিছুটা ভাল হয়েছে কারণ এটি এমবিতে আকারগুলি দেখায়। সেরাটি ফোর্সফ্যাকের সমাধান হবে তবে তার সমাধানটি স্পেস সহ ডিরেক্টরি বাদ দেয়।
xralf

1

Gnu সাজানোর বর্তমান সংস্করণ সহ (এবং @ পেঙ্গুইন 359 ফাইলের ধরণ ধার করা)

cd /tmp; du -sShc .[^.] .??* * | sort -h

সাজানোর পুরানো সংস্করণ সহ

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

সম্পাদনা: সাব-ডিরেক্টরি অন্তর্ভুক্ত না করার জন্য -S পরামিতি যুক্ত করা duহয়েছে।


আমি বরং ফাইল এবং ডিরেক্টরি ব্যবহার করে ডিস্ক স্পেস চেয়েছিলাম (অভ্যন্তরের ডেটার মোট আকার) সরাসরি tmp এর অধীনে (সাব ডিরেক্টরিতে নয়)। আমার সাজ্ট কমান্ড -h বিকল্প নেই।
xralf

আপনি কী বোঝাতে চেয়েছেন তা আমি 100% নিশ্চিত নই, যেহেতু আপনি ইতিমধ্যে একই ফাইলের প্যাটার্ন নির্বাচনের উত্তর গ্রহণ করেছেন। সাবডিয়ারদের অন্তর্ভুক্ত না করার জন্য আমার পোস্ট সম্পাদনা করা। আপনি যদি আপাত আকার চান এবং না ব্যবহার করা আসল ডিস্কের জায়গা চান তবে --apparent-sizeআপনি ডু প্যারামিটার যুক্ত করতে পারেন ।
ফোর্সফেস্ক

এখন এটি দুর্দান্ত কাজ করে। আমাকে কেবল জিবি এবং তারপরে এমবি অনুসন্ধান করতে হবে, তবে এটি কোনও সমস্যা নয়।
xralf

আমার ইউনিট চিঠিগুলি ভুল ক্রমে ছিল, এখন ঠিক। আপনি যদি বড় থেকে ছোটতে অর্ডারটি চান তবে ইউনিট অক্ষরের ক্রম পরিবর্তন করুন এবং সাজানোর জন্য -r যোগ করুন।
ফোর্সফেস্ক

আমি লক্ষ্য করেছি, এটি ডিরেক্টরি আকার (প্রিফিক্স ব্যতীত) মুদ্রণ করতে ভুলে গেছে
xralf

0

আপডেট: আমি আগের স্ক্রিপ্টটি স্ক্র্যাপ করেছি। ব্যবহার করে duএবং awk (পূর্ববর্তীটি ব্যবহৃত treeএবং sed) এখানে একটি নতুন সংস্করণ রয়েছে

এটি এর ফলাফল: dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

এখানে স্ক্রিপ্ট

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#

আপনি যখন সমস্ত ফাইল এবং ডিরেক্টরিগুলির আকারের কথা বলবেন , আপনি কি বোঝাতে চেয়েছেন যে প্রতিটি আইটেমটি ডিস্কে স্থান নেয় (উদাহরণস্বরূপ আমার উবুন্টু এক্সট 4 ফাইল সিস্টেমে, একটি খালি ডিরেক্টরিতে 4k ডিস্ক-স্পেস লাগে এবং 4k এর চেয়ে ছোট ফাইল 4k নেয় । সর্বনিম্ন বরাদ্দ অংশটি 4k) .. বা আপনি প্রতিটি ফাইলের ডেটার পরিমাণকে বোঝাতে চান , যেমন 100 (বাইট) .. এবং ডিরেক্টরিগুলির জন্য আপনি কি সেই ডিরেক্টরিতে ফাইলের মোট তথ্য জানতে চান .. যদি আপনি ডাটা আকার চাও ভিতরে ফাইল, তারপর treeনা হয়। আপনি যদি ডিস্ক-স্পেস ব্যবহার করতে চান তবে duতা করে ... ( treeকোনও ডিরেক্টরি মোট নয়)
পিটার.ও

'ডু' আরও ভাল পছন্দ ... আমি সবেমাত্র লক্ষ্য করেছি man du, এটি নিয়মিত ফাইলগুলিতে "আপাত ফাইল আকার" .... The apparent size of a file is the number of bytes reported by ডাব্লুসিসি-সি 'বা আরও সাধারণভাবে ls -l --block-size=1' or স্ট্যাট - ফর্ম্যাট =% রিপোর্ট করতে পারে s 'এর। উদাহরণস্বরূপ, ফাইলটি রয়েছেzoo' with no newline would, of course, have an apparent size of 3.
পিটার.ও

আমি বরং ফাইল এবং ডিরেক্টরি ব্যবহার করে ডিস্ক স্পেস চেয়েছিলাম (অভ্যন্তরের ডেটার মোট আকার) সরাসরি tmp এর অধীনে (উপ-ডিরেক্টরি নয়)
xralf

আমি দুঃখিত, আমি শেল স্ক্রিপ্টিংয়ের পর্যায়ে নেই আমি এটি এখনও বুঝতে পারছিলাম, সুতরাং এটির উত্তম উত্তর কী তা ঠিক করার জন্য আমি এটি অন্য ব্যবহারকারীদের কাছে ছেড়ে দিয়েছি। আপনার কাজের জন্য ধন্যবাদ। আমি আরও ভাল হলে আমি এটি অধ্যয়ন করব।
xralf

0
find /tmp -exec du {} + | sort -nr | less 

প্রথমে বৃহত্তম ফাইলগুলি দেখায়, যাতে আপনি qযথেষ্ট পরিমাণে দেখার সাথে সাথে ইউটি করতে পারেন ।

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