Điều này được đăng lại từ đây theo lệnh của người hỏi:
du --inodes -S | sort -rh | sed -n \
'1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
Và nếu bạn muốn ở trong cùng một hệ thống tập tin bạn làm:
du --inodes -xS
Dưới đây là một số ví dụ đầu ra:
15K /usr/share/man/man3
4.0K /usr/lib
3.6K /usr/bin
2.4K /usr/share/man/man1
1.9K /usr/share/fonts/75dpi
...
519 /usr/lib/python2.7/site-packages/bzrlib
516 /usr/include/KDE
498 /usr/include/qt/QtCore
487 /usr/lib/modules/3.13.6-2-MANJARO/build/include/config
484 /usr/src/linux-3.12.14-2-MANJARO/include/config
BÂY GIỜ VỚI LS:
Một số người đề cập rằng họ không có coreutils cập nhật và tùy chọn --inodes không có sẵn cho họ. Vì vậy, đây là ls:
ls ~/test -AiR1U |
sed -rn '/^[./]/{h;n;};G;
s|^ *([0-9][0-9]*)[^0-9][^/]*([~./].*):|\1:\2|p' |
sort -t : -uk1.1,1n |
cut -d: -f2 | sort -V |
uniq -c |sort -rn | head -n10
Nếu bạn tò mò, trái tim và linh hồn của thứ tẻ nhạt regex
đó sẽ thay thế filename
trong mỗi ls's
kết quả tìm kiếm đệ quy bằng tên thư mục mà nó được tìm thấy. Từ đó, chỉ cần nén các số inode lặp đi lặp lại sau đó đếm các tên thư mục lặp lại và sắp xếp tương ứng.
Các -U
tùy chọn này đặc biệt hữu ích với những sắp xếp ở chỗ nó đặc biệt nào không sắp xếp, và thay vào đó trình bày các danh sách thư mục theo thứ tự ban đầu - hoặc, nói cách khác, bằng inode
số.
Và tất nhiên -1
là vô cùng hữu ích ở chỗ nó đảm bảo một kết quả duy nhất cho mỗi dòng, bất kể có thể bao gồm các dòng mới trong tên tệp hoặc các vấn đề đáng tiếc ngoạn mục khác có thể xảy ra khi bạn cố gắng phân tích danh sách.
Và tất nhiên -A
cho tất cả và -i
cho inode và -R
cho đệ quy và đó là dài và ngắn của nó.
Phương pháp cơ bản cho vấn đề này là tôi thay thế mỗi tên tệp của ls bằng tên thư mục chứa trong sed. Tiếp theo đó ... Chà, bản thân tôi hơi mờ nhạt. Tôi khá chắc chắn rằng nó đếm chính xác các tệp, như bạn có thể thấy ở đây:
% _ls_i ~/test
> 100 /home/mikeserv/test/realdir
> 2 /home/mikeserv/test
> 1 /home/mikeserv/test/linkdir
Điều này cung cấp cho tôi khá nhiều kết quả giống hệt với du
lệnh:
DU:
15K /usr/share/man/man3
4.0K /usr/lib
3.6K /usr/bin
2.4K /usr/share/man/man1
1.9K /usr/share/fonts/75dpi
1.9K /usr/share/fonts/100dpi
1.9K /usr/share/doc/arch-wiki-markdown
1.6K /usr/share/fonts/TTF
1.6K /usr/share/dolphin-emu/sys/GameSettings
1.6K /usr/share/doc/efl/html
LS:
14686 /usr/share/man/man3:
4322 /usr/lib:
3653 /usr/bin:
2457 /usr/share/man/man1:
1897 /usr/share/fonts/100dpi:
1897 /usr/share/fonts/75dpi:
1890 /usr/share/doc/arch-wiki-markdown:
1613 /usr/include:
1575 /usr/share/doc/efl/html:
1556 /usr/share/dolphin-emu/sys/GameSettings:
Tôi nghĩ rằng include
điều này chỉ phụ thuộc vào thư mục mà chương trình nhìn vào đầu tiên - bởi vì chúng là các tệp giống nhau và được liên kết cứng. Kinda như điều trên. Tôi có thể sai về điều đó mặc dù - và tôi hoan nghênh sự điều chỉnh ...
DU DEMO
% du --version
> du (GNU coreutils) 8.22
Tạo một thư mục thử nghiệm:
% mkdir ~/test ; cd ~/test
% du --inodes -S
> 1 .
Một số thư mục trẻ em:
% mkdir ./realdir ./linkdir
% du --inodes -S
> 1 ./realdir
> 1 ./linkdir
> 1 .
Tạo một số tệp:
% printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Một số liên kết cứng:
% printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` |
. /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Nhìn vào các liên kết cứng:
% cd ./linkdir
% du --inodes -S
> 101
% cd ../realdir
% du --inodes -S
> 101
Họ được tính một mình, nhưng đi lên một thư mục ...
% cd ..
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Sau đó, tôi chạy tập lệnh đã chạy của tôi từ bên dưới và:
> 100 /home/mikeserv/test/realdir
> 100 /home/mikeserv/test/linkdir
> 2 /home/mikeserv/test
Và Graeme:
> 101 ./realdir
> 101 ./linkdir
> 3 ./
Vì vậy, tôi nghĩ rằng điều này cho thấy cách duy nhất để đếm inodes là inode. Và bởi vì đếm các tệp có nghĩa là đếm các nút, bạn không thể đếm gấp đôi các nút - để đếm các tệp chính xác, các nút không thể được đếm nhiều lần.