Tìm thư mục có nhiều tệp trong


33

Vì vậy, một khách hàng của tôi đã nhận được email từ Linode hôm nay nói rằng máy chủ của họ đang khiến dịch vụ sao lưu của Linode bị nổ tung. Tại sao? Quá nhiều tập tin. Tôi cười rồi chạy:

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

Tào lao 2,4 triệu inodes đang sử dụng. Cái quái gì đang diễn ra vậy?!

Tôi đã tìm kiếm các nghi phạm rõ ràng ( /var/{log,cache}và thư mục nơi tất cả các trang web được lưu trữ từ đó) nhưng tôi không tìm thấy bất cứ điều gì thực sự đáng ngờ. Ở đâu đó trên con thú này, tôi chắc chắn có một thư mục chứa vài triệu tệp.

Đối với ngữ cảnh, các máy chủ bận rộn của tôi sử dụng 200k inodes và máy tính để bàn của tôi (một bản cài đặt cũ với hơn 4TB dung lượng lưu trữ đã sử dụng) chỉ hơn một triệu. Có một vấn đề.

Vì vậy, câu hỏi của tôi là, làm thế nào để tôi tìm thấy vấn đề là ở đâu? Có một duinodes?



1
chạy vmstat -1 100 và cho chúng tôi thấy một số điều đó. coi chừng số lượng lớn trong CS (Chuyển ngữ cảnh). Đôi khi một hệ thống tập tin bị lỗi có thể mất rất nhiều lỗi cho các lỗi. Hoặc có lẽ hợp pháp, có nhiều tập tin. Liên kết này sẽ thông báo cho bạn về các tập tin và inodes. stackoverflow.com/questions/653096/howto-free-inode-usage bạn có thể cần xem những gì đang chạy / mở bằng lệnh lsof.
j0h

Câu trả lời:


23

Kiểm tra /lost+foundtrong trường hợp có vấn đề về đĩa và rất nhiều rác đã bị phát hiện dưới dạng các tệp riêng biệt, có thể sai.

Kiểm tra iostatxem một số ứng dụng vẫn đang tạo các tệp như crazy.

find / -xdev -type d -size +100ksẽ cho bạn biết nếu có một thư mục sử dụng hơn 100kB dung lượng đĩa. Đó sẽ là một thư mục chứa rất nhiều tệp hoặc chứa rất nhiều tệp trong quá khứ. Bạn có thể muốn điều chỉnh kích thước con số.

Tôi không nghĩ có sự kết hợp các tùy chọn với GNU duđể làm cho nó được tính 1 cho mỗi mục nhập thư mục. Bạn có thể làm điều này bằng cách tạo danh sách các tệp với findvà thực hiện một chút đếm trong awk. Đây là một duinodes. Đã thử nghiệm tối thiểu, không cố gắng đối phó với tên tệp có chứa dòng mới.

#!/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"; }'

Cách sử dụng : du-inodes /. In một danh sách các thư mục không trống với tổng số mục trong đó và các thư mục con của chúng theo cách đệ quy. Chuyển hướng đầu ra đến một tập tin và xem xét nó một cách thoải mái. sort -k1nr <root.du-inodes | headsẽ cho bạn biết những người phạm tội lớn nhất.


Kịch bản đưa ra lỗi:awk: line 2: find: regular expression compile failed (bad class -- [], [^] or [) [^ awk: line 2: syntax error at or near ] `/tmp/tmpw99dhs': Permission denied
Radu Rădeanu

@ RaduRădeanu Ah, tôi hiểu rồi, tôi đã sử dụng một đặc thù gawk không hoạt động trong các phiên bản khác. Tôi đã thêm dấu gạch chéo ngược mà tôi nghĩ là cần thiết theo POSIX.
Gilles 'SO- đừng trở nên xấu xa'

14

Bạn có thể kiểm tra với tập lệnh này:

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

Điều này in ra 10 thư mục con hàng đầu theo số tập tin. Nếu bạn muốn một đỉnh x, hãy thay đổi headbằng head -n x, xsố tự nhiên lớn hơn 0.

Để có kết quả chắc chắn 100%, hãy chạy tập lệnh này với quyền root:

thư mục hàng đầu


2019: giơ lên 10: read: Illegal option -d... chà -dcờ vì readhy vọng không có gì xấu xảy ra. Sẽ cho bạn biết khi nào nó kết thúc chạy ...
Williams

3

Thường nhanh hơn tìm kiếm, nếu cơ sở dữ liệu định vị của bạn được cập nhật:

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

Thao tác này sẽ loại bỏ toàn bộ cơ sở dữ liệu định vị, loại bỏ mọi thứ qua '/' cuối cùng trong đường dẫn, sau đó sắp xếp và "uniq -c" giúp bạn có được số lượng tệp / thư mục trên mỗi thư mục. "Sắp xếp -n" nối đuôi nhau để giúp bạn có mười thư mục có nhiều thứ nhất trong đó.


+1: sử dụng cơ sở dữ liệu định vị là một ý tưởng rất hay!
Max Beikirch

Khi bạn không thể sử dụng định vị vì bất kỳ lý do gì, hãy chạy find /path/to/parent -xdev > filelistđầu tiên, sau đó trực tiếp sed để đọc đầu vào từ danh sách đó.
gerrit

1

Một đề nghị khác:

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

Sử dụng các tìm kiếm này để tìm các tệp lớn nhất trên máy chủ của bạn.

Tìm tệp trên 1GB

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

Tìm tệp trên 100MB

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

Tìm tệp trên 10MB

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

Phần đầu tiên là lệnh find sử dụng cờ "-size" để tìm các tệp trên các kích thước khác nhau được đo bằng kilobyte.

Bit cuối cùng ở cuối bắt đầu bằng "-exec" cho phép chỉ định một lệnh chúng ta muốn thực thi trên mỗi tệp chúng ta tìm thấy. Ở đây lệnh "ls -lh" để bao gồm tất cả các thông tin nhìn thấy khi liệt kê nội dung của một thư mục. H về cuối là đặc biệt hữu ích vì nó in ra kích thước của mỗi tệp ở định dạng có thể đọc được.


2
Vấn đề của anh là sử dụng inode cao, chỉ ra nhiều tệp nhỏ hơn, không phải tệp lớn.
UpTheCux

0

Điều này làm việc cho tôi khi người khác thất bại trên Android thông qua trình bao:

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

0

Tôi muốn sử dụng một cái gì đó như du --inodes -d 1để tìm một thư mục hoặc đệ quy hoặc trực tiếp chứa rất nhiều tập tin.

Tôi cũng thích câu trả lời này: https://unix.stackexchange.com/a/123052

Đối với sự lười biếng của chúng tôi, đây là ý chính của nó:

du --inodes -S | sort -rh | sed -n \
    '1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
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.