นี่คือ reposted จากที่นี่ตามคำสั่งของผู้ถาม:
du --inodes -S | sort -rh | sed -n \
'1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
และถ้าคุณต้องการอยู่ในระบบไฟล์เดียวกับคุณ:
du --inodes -xS
นี่คือตัวอย่างผลลัพธ์:
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
ตอนนี้ด้วย LS:
มีหลายคนที่กล่าวถึงว่าพวกเขาไม่มี coreutils ที่ทันสมัยและตัวเลือก --inode ไม่สามารถใช้ได้ ดังนั้นนี่คือ 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
หากคุณอยากรู้อยากเห็นหัวใจที่น่าเบื่อของสิ่งนั้นน่าเบื่อหน่ายregex
แทนที่filename
ในls's
ผลลัพธ์การค้นหาแบบเรียกซ้ำด้วยชื่อไดเรกทอรีที่พบ จากนั้นเป็นเพียงเรื่องของการบีบหมายเลขไอโหนดซ้ำแล้วนับชื่อไดเรกทอรีซ้ำและเรียงลำดับตาม
-U
ตัวเลือกที่เป็นประโยชน์อย่างยิ่งกับการเรียงลำดับในการที่จะมาโดยเฉพาะไม่ได้เรียงลำดับและแทนที่จะแสดงรายการไดเรกทอรีในการสั่งซื้อเดิม - หรือในคำอื่น ๆ โดยinode
จำนวน
และแน่นอนว่า-1
มีประโยชน์อย่างไม่น่าเชื่อในการช่วยให้มั่นใจผลเดียวต่อบรรทัดโดยไม่คำนึงถึงอาจรวมถึงการขึ้นบรรทัดใหม่ในชื่อไฟล์หรือปัญหาที่โชคร้ายอื่น ๆ ที่อาจเกิดขึ้นเมื่อคุณพยายามที่จะแยกรายการ
และแน่นอน-A
สำหรับทั้งหมดและ-i
inode และ-R
สำหรับการเรียกซ้ำและนั่นคือความยาวและระยะสั้นของมัน
วิธีการพื้นฐานของสิ่งนี้คือฉันแทนที่ทุกชื่อไฟล์ของ ls ด้วยชื่อไดเรกทอรีที่มีอยู่ใน sed ต่อจากนั้น ... เอาละฉันเองก็ฝืดนิดหน่อย ฉันค่อนข้างแน่ใจว่ามันนับไฟล์อย่างถูกต้องอย่างที่คุณเห็นที่นี่:
% _ls_i ~/test
> 100 /home/mikeserv/test/realdir
> 2 /home/mikeserv/test
> 1 /home/mikeserv/test/linkdir
นี่คือการให้ผลลัพธ์ที่เหมือนกันกับdu
คำสั่ง:
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:
ฉันคิดว่าinclude
สิ่งที่ขึ้นอยู่กับไดเรกทอรีที่โปรแกรมดูครั้งแรก - เพราะพวกเขาเป็นไฟล์เดียวกันและฮาร์ดลิงก์ ค่อนข้างชอบสิ่งเหนือ ฉันอาจจะผิดเกี่ยวกับเรื่องนั้น - และฉันยินดีต้อนรับการแก้ไข ...
DU DEMO
% du --version
> du (GNU coreutils) 8.22
ทำไดเรกทอรีทดสอบ:
% mkdir ~/test ; cd ~/test
% du --inodes -S
> 1 .
บางไดเรกทอรีลูก:
% mkdir ./realdir ./linkdir
% du --inodes -S
> 1 ./realdir
> 1 ./linkdir
> 1 .
สร้างไฟล์บางไฟล์:
% printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
บางส่วนของการเชื่อมโยง:
% printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` |
. /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
ดูการเชื่อมโยง:
% cd ./linkdir
% du --inodes -S
> 101
% cd ../realdir
% du --inodes -S
> 101
พวกเขาถูกนับคนเดียว แต่ไปหนึ่งไดเรกทอรีขึ้นไป ...
% cd ..
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
จากนั้นฉันก็เรียกใช้สคริปต์การวิ่งของฉันจากด้านล่างและ:
> 100 /home/mikeserv/test/realdir
> 100 /home/mikeserv/test/linkdir
> 2 /home/mikeserv/test
และแกรม:
> 101 ./realdir
> 101 ./linkdir
> 3 ./
ดังนั้นฉันคิดว่านี่แสดงให้เห็นว่าวิธีเดียวที่จะนับ inodes คือโดย inode และเนื่องจากการนับไฟล์หมายถึงการนับไอโหนดคุณจึงไม่สามารถนับไอโหนดได้สองเท่า - การนับไฟล์อย่างแม่นยำไอโหนดจึงไม่สามารถนับได้มากกว่าหนึ่งครั้ง