Sử dụng đĩa cho mỗi người dùng trong Linux / Unix


10

Tôi cần tìm hiểu xem mỗi người dùng trên mạng chiếm bao nhiêu dung lượng đĩa. Tôi nhận thức được dfducác lệnh: Tôi có thể liệt kê toàn bộ hệ thống tập tin và AWK đầu ra, nhưng tôi tự hỏi liệu có một lệnh chuẩn hơn không.

Đầu ra tôi đang tìm kiếm là:

usr1  xMb
usr2  yMb
[...]
Total zMb

Có ý kiến ​​gì không?

Cảm ơn!

Tái bút Mũ đỏ Linux EE

Câu trả lời:


11

Đây có phải là một lần, hoặc thông tin này bạn muốn có thể trích xuất thường xuyên? Trong trường hợp muộn hơn thì một tùy chọn là áp dụng hạn ngạch trên hệ thống tập tin của bạn. Làm như vậy hệ thống liên tục theo dõi lượng dữ liệu được sử dụng bởi mỗi người dùng. Bằng cách đó, thông tin chỉ là một truy vấn đến cơ sở dữ liệu hạn ngạch.


1
Hạn ngạch +1 là giải pháp!
ThorstenS

Một điều một lần; có thể là một giải pháp có thể được lưu trữ trong một tập lệnh nhỏ để người dùng tính toán mức độ sử dụng của họ nếu họ muốn. Chúng tôi không thể giới hạn số lượng dữ liệu vì loại công việc chúng tôi làm không phù hợp với giới hạn cứng.
Escualo

@ThorstenS: Chúng tôi thực hiện tính toán kỹ thuật và chúng tôi cần tạo ra vô số thông tin có thể hoặc không thể xóa sau khi chạy. Tôi không nghĩ rằng hạn ngạch giúp đỡ trong tình hình của chúng tôi.
Escualo

1
@Arrieta: Bạn không phải giới hạn việc sử dụng chúng. Đơn giản chỉ cần cung cấp cho mỗi người dùng một hạn ngạch cao vô lý. Ngoài ra, mọi người dùng đều có thể tự truy vấn cơ sở dữ liệu hạn ngạch và xem họ hiện đang lưu trữ bao nhiêu dữ liệu.
andol

2
Bạn thậm chí không cần đặt hạn ngạch thành một số lớn, nếu bạn không đặt nó (tức là 0) thì nó sẽ không thực thi, nhưng nó sẽ ghi lại cách sử dụng
Daniel

4

Một giải pháp tốt đẹp khác tôi tìm thấy ở đây . Điều hướng đến thư mục quan tâm, và chạy (cách khác, sự thay đổi .đến bất cứ thư mục hứng thú cho bạn, ví dụ , /home/):

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

1
+1. Có lẽ thêm một -type f là bạn thực sự chỉ tìm kiếm các tập tin?
Hennes

Câu trả lời tốt. Sử dụng -printf "%u\t%s\n"awk -v OFS="\t"nếu bạn nghĩ rằng bạn không bao giờ có thể có một tên người dùng với không gian trong đó.
TheDudeAdides

3

Hoặc để tìm người dùng có vấn đề (thư mục cũng vậy),

du -xk | sort -n | tail -25

và cho Solaris:

du -dk | sort -n | tail -25   

Điều này cung cấp cho bạn một danh sách 25 thư mục lớn nhất. Không hoàn toàn những gì bạn yêu cầu, nhưng tôi sử dụng nó mọi lúc.


2

Những gì chúng tôi làm ở nhiều nơi là sử dụng hệ thống hạn ngạch, nhưng đặt ra hạn ngạch cao vô lý. Bằng cách này bạn có được lợi ích của báo cáo nhanh. Tại một trang web, mỗi người dùng có 1 TB dung lượng "hạn ngạch".

Chúng tôi định kỳ tăng dung lượng cao hơn khi đĩa có thể phát triển - ban đầu là 30 GB cho mỗi người dùng, một mức cao vô lý tại thời điểm đó.


0

Không có lệnh đó. Bạn phải viết một số lệnh shell cho việc này.

  1. nhận tất cả người dùng từ / etc / passwd với uid> 1000
  2. sử dụng find -uid và tìm kiếm tất cả các tệp của người dùng
  3. sử dụng danh sách này để nuôi du -s

Không hiệu quả. Bạn không cần phải chạy tìm nhiều lần nếu bạn đăng nhập thông tin cùng một lúc. Lưu thông tin đó trong lần chạy đầu tiên của bạn. Hoặc trong một tập tin, hoặc trong một mảng kết hợp.
Hennes

0

Phương pháp của ThorstenS có vẻ như cần nhiều công việc hơn đối với tôi vì nó chạy tìm nhiều lần. Đối với một lần tắt, tôi sẽ chỉ thực hiện 1 lệnh tìm, và xuất chủ sở hữu và kích thước của mỗi tệp, sau đó thực hiện một số phép thuật sắp xếp trên tệp đó.

Tìm kiếm sẽ là một cái gì đó giống như trả về tên người dùng (hoặc số id không có tên người dùng) và không gian được sử dụng theo byte, trong tệp được phân cách bằng byte:

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

Bạn có thể thay thế \0bằng thứ gì đó có thể dễ làm việc hơn một chút, như tab hoặc dòng mới, nhưng sẽ ít an toàn hơn nếu bạn có tên tệp thú vị.

Nếu bạn muốn hiệu quả hơn nữa, bạn có thể chuyển đầu ra thành tập lệnh xử lý nó khi nó chạy, nhưng đó sẽ là công việc nhiều hơn một chút và bạn sẽ phải làm cho nó ngay lần đầu tiên.


0

Tôi đã thực hiện nó :) Không nhanh, nhưng hoạt động:

#!/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

Tăng tốc độ lớn sẽ xảy ra nếu chúng ta chỉ tìm kiếm các UID> 1000:

- 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.