প্রচুর ফাইল সহ ডিরেক্টরিগুলি সন্ধান করুন


33

তাই আমার এক ক্লায়েন্ট আজ লিনোডের কাছ থেকে একটি ইমেল পেয়েছে যে তাদের সার্ভারটি লিনোডের ব্যাকআপ পরিষেবাটি ব্লাড করতে পারে। কেন? অনেক বেশি ফাইল। আমি হেসে দৌড়ে গেলাম:

# df -ih
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/xvda        2.5M  2.4M   91K   97% /

বিষ্ঠা। ব্যবহৃত হয়েছে 2.4 মিলিয়ন ইনড। কী চলছে ?!

আমি সুস্পষ্ট সন্দেহভাজনদের ( /var/{log,cache}এবং যে ডিরেক্টরি থেকে সমস্ত সাইট হোস্ট করা হয়েছে) সন্ধান করেছি তবে আমি সন্দেহজনক কিছু খুঁজে পাচ্ছি না। এই জন্তুটির কোথাও আমি নিশ্চিত যে এখানে একটি ডিরেক্টরি রয়েছে যেখানে কয়েক মিলিয়ন ফাইল রয়েছে।

প্রসঙ্গ এক জন্য আমার আমার ব্যস্ত সার্ভার 200K inodes এবং আমার ডেস্কটপ (একটি পুরানো ব্যবহৃত সঞ্চয়ের 4TB উপর দিয়ে ইনস্টল) কেবল মাত্র একটি মিলিয়ন শেষ হয়ে গেছে ব্যবহার করে। একটি সমস্যা আছে.

সুতরাং আমার প্রশ্নটি হল, আমি কোথায় সমস্যাটি খুঁজে পাব? duইনোডের জন্য কি আছে ?



1
vmstat -1 100 চালান এবং সেগুলির কিছু আমাদের দেখান। সিএসে প্রচুর সংখ্যক (কনটেক্সট স্যুইচিং) সাবধান থাকুন। কখনও কখনও একটি ব্যর্থ ফাইল সিস্টেম ত্রুটি থেকে অনেকটা ইনোডকে আলগা করতে পারে। বা সম্ভবত বৈধভাবে, অনেক ফাইল আছে। এই লিঙ্কটি আপনাকে ফাইল এবং ইনোড সম্পর্কে অবহিত করবে। stackoverflow.com/questions/653096/howto-free-inode-usage আপনি দেখতে পাচ্ছেন lsof কমান্ড দিয়ে কি চলছে / উন্মুক্ত রয়েছে।
j0h

উত্তর:


23

/lost+foundকোনও ডিস্কের সমস্যা রয়েছে এবং চূড়ান্তভাবে ভুলভাবে পৃথক ফাইল হিসাবে চিহ্নিত হওয়ার ফলে প্রচুর পরিমাণে আবর্জনা শেষ হয়েছে কিনা তা পরীক্ষা করে দেখুন ।

iostatকিছু অ্যাপ্লিকেশন এখনও পাগলের মতো ফাইল তৈরি করছে কিনা তা পরীক্ষা করে দেখুন।

find / -xdev -type d -size +100k100kB এর বেশি ডিস্ক স্পেস ব্যবহার করে এমন কোনও ডিরেক্টরি আছে কিনা তা আপনাকে বলবে। এটি এমন একটি ডিরেক্টরি হবে যাতে প্রচুর ফাইল থাকে বা অতীতে অনেকগুলি ফাইল থাকে। আপনি আকারের চিত্রটি সামঞ্জস্য করতে চাইতে পারেন।

আমি মনে করি না জিএনইউতে duএটির জন্য বিকল্পগুলির সংমিশ্রণ রয়েছে যাতে ডিরেক্টরিতে প্রবেশের জন্য এটি 1 টি গণনা করা যায়। আপনি ফাইলের তালিকা তৈরি করে findএবং এজেডিতে কিছুটা গণনা করার মাধ্যমে এটি করতে পারেন। এখানে আইনের জন্য একটি du। সর্বনিম্ন পরীক্ষিত, নতুন লাইনের সমন্বিত ফাইলের নামগুলির সাথে লড়াই করার চেষ্টা করবেন না।

#!/bin/sh
find "$@" -xdev -depth | awk '{
    depth = $0; gsub(/[^\/]/, "", depth); depth = length(depth);
    if (depth < previous_depth) {
       # A non-empty directory: its predecessor was one of its files
       total[depth] += total[previous_depth];
       print total[previous_depth] + 1, $0;
       total[previous_depth] = 0;
    }
    ++total[depth];
    previous_depth = depth;
}
END { print total[0], "total"; }'

ব্যবহার: du-inodes /। পুনরাবৃত্তভাবে তাদের এবং তাদের উপ-ডিরেক্টরিগুলির মোট এন্ট্রিগুলির গণনা সহ খালি নয় এমন ডিরেক্টরিগুলির তালিকা মুদ্রণ করে। আউটপুটটিকে কোনও ফাইলে পুনর্নির্দেশ করুন এবং আপনার অবসর সময়ে পর্যালোচনা করুন। sort -k1nr <root.du-inodes | headআপনাকে সবচেয়ে বড় অপরাধী বলবে।


স্ক্রিপ্টটি ত্রুটি দেয়:awk: line 2: find: regular expression compile failed (bad class -- [], [^] or [) [^ awk: line 2: syntax error at or near ] `/tmp/tmpw99dhs': Permission denied
রাদু রাদানু

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

14

আপনি এই স্ক্রিপ্ট দিয়ে পরীক্ষা করতে পারেন:

#!/bin/bash

if [ $# -ne 1 ];then
  echo "Usage: `basename $0` DIRECTORY"
  exit 1
fi

echo "Wait a moment if you want a good top of the bushy folders..."

find "$@" -type d -print0 2>/dev/null | while IFS= read -r -d '' file; do 
    echo -e `ls -A "$file" 2>/dev/null | wc -l` "files in:\t $file"
done | sort -nr | head | awk '{print NR".", "\t", $0}'

exit 0

এটি ফাইল গণনা দ্বারা শীর্ষ 10 উপ-ডিরেক্টরি মুদ্রণ করে। আপনি যদি শীর্ষস্থানীয় x চান, তবে এটির headসাথে পরিবর্তন করুন head -n x, যেখানে xপ্রাকৃতিক সংখ্যা 0 এর চেয়ে বড়।

100% নিশ্চিত ফলাফলের জন্য, মূল স্ক্রিপ্টগুলি সহ এই স্ক্রিপ্টটি চালান:

টপ জঙ্গলময়-ফোল্ডার


2019: উত্থাপিত 10: read: Illegal option -d... খারাপ কিছু হবে না এই আশঙ্কায় -dপতাকাটি ঝাঁকুনি দিয়েছিল read। এটি যখন চলমান শেষ করবে তখন আপনাকে
উইলিয়ামস

3

অনুসন্ধানের চেয়ে প্রায়শই দ্রুত, যদি আপনার অবস্থানের ডেটাবেসটি আপ টু ডেট থাকে:

# locate '' | sed 's|/[^/]*$|/|g' | sort | uniq -c | sort -n | tee filesperdirectory.txt | tail

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


+1: সনাক্ত ডাটাবেস ব্যবহার করা খুব সুন্দর ধারণা!
সর্বাধিক বীকিচ

আপনি যখন কোনও কারণে অবস্থান ব্যবহার করতে পারবেন না, find /path/to/parent -xdev > filelistপ্রথমে চালান , তারপরে সেই তালিকা থেকে ইনপুট পড়ার জন্য সরাসরি সেড করুন।
জাগ্রত

1

অন্য একটি পরামর্শ:

http://www.iasptk.com/20314-ubuntu-find-large-files-fast-from-command-line

আপনার সার্ভারে বৃহত্তম ফাইলগুলি খুঁজতে এই অনুসন্ধানগুলি ব্যবহার করুন।

1 জিবি-র উপরে ফাইলগুলি সন্ধান করুন

sudo সন্ধান / -প্রকার এফ-সাইজ + 1000000 কে-এক্সেক এলএস-এলএইচ {{\;

100MB এর বেশি ফাইল সন্ধান করুন

sudo সন্ধান করুন / -প্রকার-এফ-সাইজ + 100000k -exec ls -lh find} \;

10 এমবি-র উপরে ফাইলগুলি সন্ধান করুন

sudo সন্ধান করুন / -প্রকার-এফ-সাইজ + 10000k -exec ls -lh {} \;

প্রথম অংশটি হ'ল ফাইন্ড কমান্ডটি হ'ল "-সাইজ" পতাকাটি ব্যবহার করে কিলোবাইটে পরিমাপ করা বিভিন্ন আকারের ফাইলগুলি খুঁজে পেতে।

"-Exec" দিয়ে শুরু করে শেষ বিটটি আমরা খুঁজে পাওয়া প্রতিটি ফাইলের উপর নির্বাহ করতে চাইলে একটি কমান্ড নির্দিষ্ট করতে দেয়। এখানে "ls -lh" কমান্ড নির্দেশিকার সামগ্রীর তালিকা করার সময় সমস্ত তথ্য অন্তর্ভুক্ত করতে অন্তর্ভুক্ত করে। প্রান্তটি এইচটি বিশেষত সহায়ক কারণ এটি প্রতিটি ফাইলের আকার একটি মানব পাঠযোগ্য বিন্যাসে মুদ্রণ করে।


2
তার সমস্যাটি উচ্চতর ইনোডের ব্যবহার, যা অনেকগুলি ছোট ফাইলগুলিকে দেখায়, বড় ফাইলগুলি নয়।
আপক্রিক

0

যখন শেলের মাধ্যমে অন্যের অ্যান্ড্রয়েডে ব্যর্থ হয়েছিল তখন এটি আমার জন্য কাজ করেছিল:

find / -type d -exec sh -c "fc=\$(find '{}' -type f | wc -l); echo -e \"\$fc\t{}\"" \; | sort -nr | head -n25

0

আমি এর মতো কিছু ব্যবহার করতে চাই du --inodes -d 1 ডিরেক্টরি যা পুনরাবৃত্তভাবে বা সরাসরি প্রচুর ফাইল ধারণ করে find

আমি এই উত্তরটিও পছন্দ করি: https://unix.stackexchange.com/a/123052

আমাদের অলসতার জন্য এটির সংক্ষিপ্তসার এখানে রয়েছে:

du --inodes -S | sort -rh | sed -n \
    '1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.