लिनक्स / यूनिक्स में प्रति उपयोगकर्ता डिस्क का उपयोग


10

मुझे यह पता लगाने की आवश्यकता है कि नेटवर्क पर प्रत्येक उपयोगकर्ता द्वारा कितनी डिस्क स्थान पर कब्जा किया जा रहा है। मैं जानता हूं dfऔर duआदेश देता हूं: मैं संपूर्ण फाइलसिस्टम और एडब्ल्यूके आउटपुट को सूचीबद्ध कर सकता हूं, लेकिन मुझे आश्चर्य है कि क्या अधिक मानक कमांड है।

मैं जिस आउटपुट की तलाश कर रहा हूं वह है:

usr1  xMb
usr2  yMb
[...]
Total zMb

कोई विचार?

धन्यवाद!

पुनश्च। रेड हैट लिनक्स ईई

जवाबों:


11

क्या यह एक बार की बात है, या यह जानकारी जिसे आप नियमित रूप से निकालना चाहते हैं? यदि यह बाद में है तो आपके फाइल सिस्टम पर कोटा लागू करने का एक विकल्प है। ऐसा करना कि सिस्टम लगातार प्रत्येक उपयोगकर्ता द्वारा उपयोग किए जाने वाले डेटा की मात्रा का ट्रैक रखता है। इस तरह से जानकारी केवल कोटा डेटाबेस के लिए एक क्वेरी है।


1
+1 कोटा समाधान है!
थोरस्टैंस

एक बार की बात; संभवत: एक समाधान जो उपयोगकर्ताओं के लिए एक छोटी स्क्रिप्ट में संग्रहीत किया जा सकता है यदि वे चाहते हैं तो उनके उपयोग की गणना करें। हम उस प्रकार के डेटा को सीमित नहीं कर सकते हैं जिस प्रकार के काम के कारण हम कठिन सीमाओं को समायोजित नहीं करते हैं।
Escualo

@ThorstenS: हम तकनीकी कंप्यूटिंग करते हैं और हमें एक सूचना के निर्माण की आवश्यकता होती है जो एक रन बनने के बाद दूर हो सकती है या नहीं। मुझे नहीं लगता कि कोटा हमारी स्थिति में मदद करता है।
Escualo

1
@ श्री: आपको उनके उपयोग को सीमित करने की आवश्यकता नहीं है। बस प्रत्येक उपयोगकर्ता को एक हास्यास्पद हाइट कोटा दें। साथ ही, प्रत्येक उपयोगकर्ता कोटा डेटाबेस को स्वयं क्वेरी कर सकता है और देख सकता है कि वे वर्तमान में कितना डेटा संग्रहित कर रहे हैं।
औरोल

2
आपको कोटा को एक बड़ी संख्या में सेट करने की भी आवश्यकता नहीं है, यदि आप इसे छोड़ देते हैं (यानी 0) यह इसे लागू नहीं करेगा, लेकिन यह उपयोग रिकॉर्ड करेगा
डैनियल

4

एक और अच्छा समाधान मुझे यहाँ मिला । नेविगेट ब्याज की निर्देशिका, और चलाने के लिए (वैकल्पिक रूप से, परिवर्तन .जो भी निर्देशिका हितों के लिए आप, उदाहरण के लिए , /home/):

find . -type f -printf "%u  %s\n" \
  | awk '{user[$1]+=$2}; END{for(i in user) print i,user[i]}'

1
+1। हो सकता है कि एक-प्रकार जोड़ें f क्या आप वास्तव में केवल फाइलों की तलाश में हैं?
हेन्नेस

अच्छा उत्तर। का उपयोग करें -printf "%u\t%s\n"औरawk -v OFS="\t" यदि आपको लगता है कि आपके पास कभी भी इसमें स्थान के साथ एक उपयोगकर्ता नाम हो सकता है।
TheDudeAbides

3

या समस्या उपयोगकर्ताओं (निर्देशिका भी) खोजने के लिए,

du -xk | sort -n | tail -25

और सोलारिस के लिए:

du -dk | sort -n | tail -25   

यह आपको 25 सबसे बड़ी निर्देशिकाओं की एक सूची देता है। आपने जो मांगा, वह बिल्कुल नहीं, लेकिन मैं हर समय इसका उपयोग करता हूं।


2

हम कई स्थानों पर कोटा प्रणाली का उपयोग करते हैं, लेकिन बेतुका उच्च कोटा निर्धारित करते हैं। इस तरह से आपको फास्ट रिपोर्टिंग का लाभ मिलता है। एक साइट पर, प्रत्येक उपयोगकर्ता के पास "कोटा" स्थान का 1 टीबी है।

हम समय-समय पर कोटा को उच्चतर करते हैं क्योंकि सेवा करने योग्य डिस्क बढ़ती है - शुरू में यह प्रति उपयोगकर्ता 30GB थी, उस समय कुछ ज्यादा ही बेतुका था।


0

ऐसा कोई आदेश नहीं है। आपको इसके लिए कुछ शेल कमांड लिखना होगा।

  1. uid> 1000 के साथ / etc / passwd से सभी उपयोगकर्ता प्राप्त करें
  2. फाइंड-यूआईडी का उपयोग करें और उपयोगकर्ता की सभी फाइलों को खोजें
  3. इस सूची का उपयोग डु -s खिलाने के लिए करें

अक्षम। यदि आप एक ही समय में जानकारी लॉग करते हैं तो आपको कई बार खोजने की आवश्यकता नहीं है। अपने पहले रन के दौरान उस जानकारी को सेव करें। या तो एक फ़ाइल में, या एक साहचर्य सरणी में।
हेन्नेस

0

थोरस्टेन की विधि अधिक काम की तरह लगती है, फिर मेरे लिए आवश्यक है क्योंकि यह कई बार चलती है। एक बंद के लिए, मैं सिर्फ 1 कमांड का पता लगाऊंगा, और प्रत्येक फ़ाइल के मालिक और आकार का उत्पादन करूँगा, और फिर उस फ़ाइल पर कुछ जादू करूँगा।

यह खोज कुछ ऐसी होगी जो उपयोगकर्ता नाम (या बिना उपयोगकर्ता नाम की आईडी) और रिक्त स्थान के बाइट में उपयोग की गई, एक अशक्त बाइट सीमांकित फ़ाइल में:

sudo bash -c 'find . -printf "%u\0%s\0" > username_usage'

आप प्रतिस्थापित कर सकते हैं \0 ऐसी चीज़ से , जो टैब या न्यूलाइन्स की तरह काम करने में थोड़ी आसान हो सकती है, लेकिन अगर आपके पास फंकी फ़ाइल नाम हैं तो यह कम सुरक्षित होगा।

यदि आप और भी अधिक कुशल होना चाहते हैं, तो आप आउटपुट को स्क्रिप्ट में पाइप कर सकते हैं जो इसे चलाता है जैसे कि यह चलता है, लेकिन यह थोड़ा अधिक काम होगा, और आपको इसे पहली बार सही करना होगा।


0

मैंने इसे बनाया है :) तू उपवास नहीं, लेकिन काम करता है:

#!/bin/bash

# Displays disk usage per user in the specified directory
# Usage: ./scriptname [target-directory]

[ "x$1" == "x" ] && dirname="." || dirname="$1"
for uid in `cat /etc/passwd |awk -F : '{ print $1 }' ` ; do # List all usernames
    user_size=0
    for file in `find "$dirname" -type f -user "$uid" 2>/dev/null` ; do # List the folder's files that belongs to the current user, Ignore possible `find` errors.
        let user_size+=`stat -c '%s' $file` # Sum-up
        done
    [ $user_size -gt 0 ] && echo "USER=$uid, SIZE=$user_size" # Display the result if >0
    done

यदि हम UID के लिए केवल १००० की मांग करते हैं तो बड़ी गति वृद्धि होगी:

- for uid in `cat /etc/passwd | sed -rn "s~^([^:]+):.*$~\1~p"` ; do # List all usernames
+ for uid in `cat /etc/passwd | sed -rn "s~^([^:]+):[^:]:[0-9]{4,}:.*$~\1~p"` ; do # List all usernames having UID>1000
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.