2008-12-07 47 views
44

如何找出哪些目錄負責咀嚼所有inode?我的inode在哪裏被使用?

最終的根目錄將負責inode的數量最多,所以我不知道到底什麼樣的答案,我想的..

基本上,我跑出來的inode可用的和需要找到一個不需要的目錄來剔除。

謝謝,並且對於模糊的問題感到抱歉。

+2

哇,人已經不多了inode的?從Usenet誕生的那一天起,我就沒有看到過,因爲Usenet新聞短片有很多很小的小文件,所以你必須給mkfs一個參數來使它更多的inode。 – 2008-12-07 14:24:59

+0

是的 - 當然是對過去時光的回憶。 – 2008-12-07 15:47:20

+4

我想這就像是說,「哇,你溢出了堆棧,而且這些日子裏有很多可用的內存」。這經常有一個很好的原因(特別是腳本或目錄),這就是OP正在尋找的東西。 – gbarry 2008-12-07 19:00:35

回答

19

所以基本上你在尋找哪些目錄有很多文件?下面是它的第一刺:

find . -type d -print0 | xargs -0 -n1 count_files | sort -n 

其中 「count_files」 是一個shell腳本,它(感謝喬納森)

echo $(ls -a "$1" | wc -l) $1 
+1

ls不需要'-l'參數 - 如果stdout不是tty,它將默認爲每行一個文件的輸出。 – Alnitak 2008-12-07 15:30:09

+0

如果隱藏文件以'。'開頭,則不會找到它們。我可能會使用 - echo $ 1 $(ls -a「$ 1」| wc -l) - 在一行中生成目錄名稱和計數(我可能會先倒轉列表計數的順序)。請注意文件名稱周圍引號的使用情況。 – 2008-12-07 15:53:38

+0

當你已經用盡inode時,你打算如何保存一個「count_files」shell腳本? – AnrDaemon 2016-09-26 22:15:35

6

這裏有一個簡單的Perl腳本,它會做到這一點:

#!/usr/bin/perl -w 

use strict; 

sub count_inodes($); 
sub count_inodes($) 
{ 
    my $dir = shift; 
    if (opendir(my $dh, $dir)) { 
    my $count = 0; 
    while (defined(my $file = readdir($dh))) { 
     next if ($file eq '.' || $file eq '..'); 
     $count++; 
     my $path = $dir . '/' . $file; 
     count_inodes($path) if (-d $path); 
    } 
    closedir($dh); 
    printf "%7d\t%s\n", $count, $dir; 
    } else { 
    warn "couldn't open $dir - $!\n"; 
    } 
} 

push(@ARGV, '.') unless (@ARGV); 
while (@ARGV) { 
    count_inodes(shift); 
} 

如果你想讓它像du一樣工作(其中每個目錄計數也包括子目錄的遞歸計數),那麼將遞歸函數改爲return $count,然後在遞歸點說:

$count += count_inodes($path) if (-d $path); 
80

如果你不想做一個新文件(或不能,因爲你跑出來的inode),您可以運行此查詢:

for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n 

內幕提到在另一個答案中,使用find方法會更快,因爲遞歸ls非常慢,請查看下面的解決方案! (信貸到期信貸!)

34

提供遞歸方法ls非常緩慢。 只是爲了快速找到最消耗inode的父目錄我用:

cd /partition_that_is_out_of_inodes 
for i in *; do echo -e "$(find $i | wc -l)\t$i"; done | sort -n 
1
 
for i in dir.[01] 
do 
    find $i -printf "%i\n"|sort -u|wc -l|xargs echo $i -- 
done 

dir.0 - 27913
dir.1 - 27913

0

perl腳本是好的,但要小心符號鏈接 - 只有當-l filetest返回false時,纔會遞歸,否則你最多隻會重複計數,最壞的情況是無限期地遞歸(這可能會引起微小的擔憂 - 引發撒旦1000年的統治)。

當有多個鏈接指向文件系統樹中超過一小部分文件時,在文件系統樹中統計inode的整體思路就會崩潰。

0

只是想提一提,你也可以搜索間接使用目錄的大小,例如:

find /path -type d -size +500k 

在哪裏,如果你有很多的大型目錄500K可以增加。

請注意,此方法是而不是遞歸。這隻會幫助你,如果你有一個單一的目錄很多文件,但不是如果文件均勻分佈在其後代。

10

這是我的承擔。它與其他人沒有太大的區別,但輸出結果很好,我認爲它比其他的(目錄和符號鏈接)更有效的inode。這會計算工作目錄的每個子目錄中的文件數量;它將輸出分類並格式化爲兩列;並打印總計(顯示爲「。」,工作目錄)。這不會遵循符號鏈接,但會計算以點開頭的文件和目錄。這不會計算設備節點和特殊文件,如命名管道。如果你想要計算這些,就刪除「-type l -o -type d -o -type f」測試。由於該命令被拆分爲兩個查找命令,因此無法正確區分安裝在其他文件系統上的目錄(-mount選項不起作用)。例如,這應該真的忽略「/ proc」和「/ sys」目錄。你可以看到,在包含「/ proc」和「/ sys」的「/」中運行該命令會嚴重扭曲總計數。

for ii in $(find . -maxdepth 1 -type d); do 
    echo -e "${ii}\t$(find "${ii}" -type l -o -type d -o -type f | wc -l)" 
done | sort -n -k 2 | column -t 

例子:

# cd/
# for ii in $(find -maxdepth 1 -type d); do echo -e "${ii}\t$(find "${ii}" -type l -o -type d -o -type f | wc -l)"; done | sort -n -k 2 | column -t 
./boot  1 
./lost+found 1 
./media  1 
./mnt   1 
./opt   1 
./srv   1 
./lib64  2 
./tmp   5 
./bin   107 
./sbin  109 
./home  146 
./root  169 
./dev   188 
./run   226 
./etc   1545 
./var   3611 
./sys   12421 
./lib   17219 
./proc  20824 
./usr   56628 
.    113207 
-1

此命令在極不可能的情況下工作,其中目錄結構是相同的地雷:

find/-type f | grep -oP '^/([^/]+/){3}' | sort | uniq -c | sort -n

1

只是注意,當你終於找到了一些郵件假脫機目錄並且想要刪除那裏的所有垃圾,如果文件太多,rm *將不起作用,您可以運行以下命令以quic KLY在該目錄中刪除一切:

*警告*這將刪除所有FILES迅速針對當RM不起作用

find . -type f -delete 
10

我用下面摸出(有一點幫助來自我的同事James)說我們有大量的PHP會話文件需要在一臺機器上刪除:

1.我有多少個inode被使用?

[email protected]:/# df -i 
Filesystem  Inodes IUsed IFree IUse% Mounted on 
/dev/xvda1  524288 427294 96994 81%/
none   256054  2 256052 1% /sys/fs/cgroup 
udev   254757 404 254353 1% /dev 
tmpfs   256054 332 255722 1% /run 
none   256054  3 256051 1% /run/lock 
none   256054  1 256053 1% /run/shm 
none   256054  3 256051 1% /run/user 

2.如果是那些索引節點?

[email protected]:/# find/-xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n 
[...] 
    1088 /usr/src/linux-headers-3.13.0-39/include/linux 
    1375 /usr/src/linux-headers-3.13.0-29-generic/include/config 
    1377 /usr/src/linux-headers-3.13.0-39-generic/include/config 
    2727 /var/lib/dpkg/info 
    2834 /usr/share/man/man3 
    416811 /var/lib/php5/session 
[email protected]:/# 

這是最後一行的很多PHP會話文件。

3.如何刪除所有這些文件?

刪除其中的1440分鐘(24小時)年長的目錄中的所有文件:

[email protected]:/var/lib/php5/session# find ./ -cmin +1440 | xargs rm 
[email protected]:/var/lib/php5/session# 

4.具有它的工作?

[email protected]:~# find/-xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n 
[...] 
    1088 /usr/src/linux-headers-3.13.0-39/include/linux 
    1375 /usr/src/linux-headers-3.13.0-29-generic/include/config 
    1377 /usr/src/linux-headers-3.13.0-39-generic/include/config 
    2727 /var/lib/dpkg/info 
    2834 /usr/share/man/man3 
    2886 /var/lib/php5/session 
[email protected]:~# df -i 
Filesystem  Inodes IUsed IFree IUse% Mounted on 
/dev/xvda1  524288 166420 357868 32%/
none   256054  2 256052 1% /sys/fs/cgroup 
udev   254757 404 254353 1% /dev 
tmpfs   256054 332 255722 1% /run 
none   256054  3 256051 1% /run/lock 
none   256054  1 256053 1% /run/shm 
none   256054  3 256051 1% /run/user 
[email protected]:~# 

幸運的是我們有一個意義上的警報向我們發送電子郵件,我們的inode幾乎用完。

2

實際功能的一行(GNU發現,對於其他類型的找到你需要自己的-xdev相當於留在同一個FS的。)

find/-xdev -type d | while read -r i; do printf "%d %s\n" $(ls -a "$i" | wc -l) "$i"; done | sort -nr | head -10

尾巴,顯然,可定製。

與此處的許多其他建議一樣,這將只顯示每個目錄中的條目數量,無遞歸。

P.S.

快,但不精確的一行(由目錄節點尺寸檢測):

find/-xdev -type d -size +100k

0

此計算當前目錄下的文件。即使文件名包含換行符,這也應該起作用。它使用GNU Awk。改變d的值以獲得想要的最大分離路徑深度。 0表示無限深度。

find . -mount -not -path . -print0 | gawk -v d=2 ' 
BEGIN{RS="\0";FS="/";SUBSEP="/";ORS="\0"} 
{ 
    s="./" 
    for(i=2;i!=d+1 && i<NF;i++){s=s $i "/"} 
    ++n[s] 
} 
END{for(val in n){print n[val] "\t" val "\n"}}' | sort -gz -k 1,1 

同樣由Bash 4;這是我的經驗顯著慢:

declare -A n; 
d=2 
while IFS=/ read -d $'\0' -r -a a; do 
    s="./" 
    for ((i=2; i!=$((d+1)) && i<${#a[*]}; i++)); do 
    s+="${a[$((i-1))]}/" 
    done 
    ((++n[\$s])) 
done < <(find . -mount -not -path . -print0) 

for j in "${!n[@]}"; do 
    printf '%i\t%s\n\0' "${n[$j]}" "$j" 
done | sort -gz -k 1,1 
0

使用

ncdu -x <path> 

然後按Shitf + c。通過項目分類數量在產品文件

相關問題