फ़ाइलों के बहुत से निर्देशिका खोजें


33

तो मेरे एक क्लाइंट को आज Linode का एक ईमेल मिला, जिसमें कहा गया था कि उनका सर्वर Linode की बैकअप सेवा को उड़ा रहा है। क्यूं कर? बहुत सारी फाइलें। मैं हँसा और फिर भागा:

# 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 कमांड के साथ क्या चल रहा है / खुला है।
19

जवाबों:


23

/lost+foundमामले में जाँच करें कि एक डिस्क समस्या थी और बहुत सारे कबाड़ को अलग-अलग फ़ाइलों के रूप में पता लगाया जा रहा था, संभवतः गलत तरीके से।

iostatयह देखने के लिए जांचें कि क्या कुछ एप्लिकेशन अभी भी पागलों की तरह फाइलें पैदा कर रहे हैं।

find / -xdev -type d -size +100kआपको बताएगा कि क्या कोई निर्देशिका है जो 100kB से अधिक डिस्क स्थान का उपयोग करती है। यह एक ऐसी निर्देशिका होगी जिसमें बहुत सारी फाइलें होती हैं, या अतीत में बहुत सारी फाइलें होती हैं। आप आकार आंकड़ा समायोजित करना चाह सकते हैं।

मुझे नहीं लगता कि जीएनयू में विकल्पों का एक संयोजन duहै ताकि इसे प्रति निर्देशिका प्रविष्टि 1 की गिनती में बनाया जा सके। आप फ़ाइलों की सूची के साथ उत्पादन कर सकते हैं findऔर awk में थोड़ी सी गिनती कर सकते हैं। यहाँ एक 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
रादु रयाडेनू

@ RaduRădeanu आह, मैं देखता हूं, मैंने एक gawk ख़ासियत का उपयोग किया है जो अन्य संस्करणों में काम नहीं करता है। मैंने एक बैकस्लैश जोड़ा है जो मुझे लगता है कि पोसिक्स के अनुसार आवश्यक है।
गिल्स एसओ- बुराई को रोकना '

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 उपनिर्देशिकाओं को प्रिंट करता है। आप एक शीर्ष एक्स, परिवर्तन चाहते हैं headके साथ head -n x, जहां x0 से एक प्राकृतिक संख्या में बड़ा है।

100% सुनिश्चित परिणामों के लिए, इस स्क्रिप्ट को रूट विशेषाधिकारों के साथ चलाएं:

शीर्ष जंगली-फ़ोल्डर


2019: उठा 10: read: Illegal option -d... -dझंडा फहराया readउम्मीद है कि कुछ भी बुरा नहीं होगा। आपको बताएंगे कि यह कब खत्म होगा ...
विलियम्स

3

यदि आपका डेटाबेस डेट-अप तक है, तो अक्सर खोज से अधिक तेज़:

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

यह पूरे डिटेल डेटाबेस को डंप कर देता है, रास्ते में अंतिम '/' के अतीत के सभी स्ट्रिप्स को बंद कर देता है, फिर सॉर्ट और "uniq -c" आपको प्रति डायरेक्टरी फाइलों / निर्देशिकाओं की संख्या प्राप्त करता है। "सॉर्ट-एन" पूंछ करने के लिए पाइप किया गया ताकि आप उनमें से सबसे अधिक चीजों के साथ दस निर्देशिकाओं को प्राप्त कर सकें।


+1: डिटेक्ट डेटाबेस का उपयोग करना एक बहुत अच्छा विचार है!
मैक्स बिकिरच

जब आप जो भी कारण के लिए पता लगाने का उपयोग नहीं कर सकते हैं, find /path/to/parent -xdev > filelistपहले उस सूची से इनपुट पढ़ने के लिए एक सीधा, फिर सेड करें।
gerrit

1

एक और सुझाव:

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

अपने सर्वर पर सबसे बड़ी फ़ाइलों को खोजने के लिए इन खोजों का उपयोग करें।

1GB से अधिक फ़ाइलों का पता लगाएं

sudo find / -type f -size + 1000000k -exec ls -lh {} \;

100MB से अधिक फ़ाइलें खोजें

sudo find / -type f -size + 100000k -exec ls -lh {} \;

10MB से अधिक फ़ाइलों का पता लगाएं

sudo find / -type f -size + 10000k -exec ls -lh {} \;

पहला भाग किलोबाइट्स में मापी गई विभिन्न आकारों की फाइलों को खोजने के लिए "-साइज" झंडे का उपयोग करने वाला कमांड है।

"-Exec" के साथ शुरू होने वाले अंतिम बिट एक कमांड को निर्दिष्ट करने की अनुमति देता है जिसे हम प्रत्येक फ़ाइल पर निष्पादित करना चाहते हैं जो हम पाते हैं। यहां "ls -lh" कमांड किसी निर्देशिका की सामग्री को सूचीबद्ध करते समय देखने वाली सभी जानकारी को सम्‍मिलित करने के लिए है। अंत की ओर एच विशेष रूप से सहायक है क्योंकि यह एक मानव पठनीय प्रारूप में प्रत्येक फ़ाइल के आकार को प्रिंट करता है।


2
उनकी समस्या अधिक इनोड उपयोग है, जो कई छोटी फाइलों की ओर इशारा करती है, बड़े लोगों की नहीं।
UpTheCreek

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एक निर्देशिका को खोजने के लिए कुछ का उपयोग करना पसंद करता हूं जो या तो पुनरावर्ती होता है या सीधे बहुत सारी फाइलें होती हैं।

मुझे भी यह उत्तर पसंद है: https://unix.stackexchange.com/a/123052

हम में से आलसी के लिए, यहाँ इसका सार है:

du --inodes -S | sort -rh | sed -n \
    '1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.