天天看點

linux小記:找到最占磁盤的檔案(夾)檢視占用情況最大檔案夾top10最大獨立檔案夾top10附:find指令

  • 檢視占用情況
  • 最大檔案夾top10
    • 結論
  • 最大獨立檔案夾top10
    • 結論
    • 最大檔案top10
    • 結論
  • 附:find指令
    • 格式
    • 按照檔案名查找
    • 按照正規表達式比對檔案路徑
    • 按照檔案類型查找
    • 按照目錄深度查找
    • 按照檔案時間戳進行搜尋
    • 按照檔案大小進行搜尋
    • 查找條件或與非
    • 參數傳遞
    • 其他

最近突然發現我的家目錄已經用了70%+了,是以想知道到底是什麼東西占了我這麼多地方。

主要用到了以下幾個指令:

du

disk usage檢視磁盤使用情況、

find

查找檔案、

sort

排序指令

head

顯示top N的指令。

檢視占用情況

檢視自己的home磁盤使用率:

pichu@Archer ~ $ df -h
檔案系統        容量  已用  可用 已用% 挂載點
udev            G       G    % /dev
tmpfs           G  M  G    % /run
/dev/sda7        G   G   G   % /
tmpfs           G  M  G    % /dev/shm
tmpfs           M  K  M    % /run/lock
tmpfs           G       G    % /sys/fs/cgroup
/dev/sda1       M   M  M   % /boot/efi
/dev/sdb3        G   G   G   % /home
tmpfs           G   K  G    % /run/user/1000
           

可看到100G的/home分區已經用了70%了,還剩29G。

-h

:human-readable,以人類可讀的方式顯示,即顯示為K、M、G等機關。一般

-h

都是顯示help,但是和大小相關的一般都是以人類可讀的方式輸出大小。

home下也就我一個人在用,是以65個G全是我占用的。

pichu@Archer ~ $ du -hd  /home
G     /home/pichu
G     /home
           

-h

:human-readable,同上。

-d, --max-depth=N

:目錄的層數。

是以這裡的意思是,隻檢視/home下一層目錄深度,并以人類可讀的方式輸出大小。

下面才是關鍵:找出那些最占空間的檔案。

最大檔案夾top10

最大的檔案夾top10:

pichu@Archer ~ $ du -h ~ | sort -hr | head - 
G     /home/pichu
G     /home/pichu/VirtualBox VMs/Win7
G     /home/pichu/VirtualBox VMs
G    /home/pichu/.IntelliJIdea2017
G    /home/pichu/.IntelliJIdea2017/system
G    /home/pichu/.IntelliJIdea2017/system/index
G    /home/pichu/Codes/Java
G    /home/pichu/Codes
G    /home/pichu/.m2/repository
G    /home/pichu/.m2
           

sort

:

-r, --reverse

:逆序排列。本來對數字排序應該是1在前,2在後,現在反過來了。

-h, --human-numeric-sort

:既然顯示檔案大小的指令,

-h

代表人類可讀的方式輸出檔案大小,那麼sort指令自然是以人類可讀的數字去排序。

head

:

-n, --lines=[-]NUM

:輸出多少行。

-n 10

等價于

-10

是以指令的意思就是顯示home下所有檔案的大小,并逆序排列,最後顯示top10。

如果

sort

不加

-h

[email protected] ~ $ du -h ~ | sort -r | head - 
M    /home/pichu/.m2/repository/org/apache/hadoop/hadoop-yarn-server-resourcemanager/
M    /home/pichu/.m2/repository/org/apache/hadoop/hadoop-yarn-server-resourcemanager
M    /home/pichu/.ivy2/cache/toolbox/text-tools/zips
M    /home/pichu/.ivy2/cache/external/findbugs/zips
M     /home/pichu/.atom/packages/markdown-pdf/node_modules
M     /home/pichu/.atom/packages/markdown-pdf
K    /home/pichu/.m2/repository/org/apache/commons/commons-math/
           

可看到排名前幾的竟然才9.9M,而65G的/home/pichu竟然榜上無名。這是因為沒了

-h

sort

單純按照數字大小排序。是以

du

sort

需要同時用

-h

(或者同時不用)。

結論

根據輸出結果,可看到最大的檔案夾是65G的/home/pichu,其次是放置了windows7虛拟機的檔案夾。緊接着,程式設計IDE intellij idea占用空間較大,看目錄得知是idea建構的索引的大小。是以說,之是以用idea程式設計這麼友善,是因為它背後默默地做了相當多的工作。

然後我的代碼目錄占了3.8G。想想應該主要是有很多工程用的ant+ivy,這些工具必須将依賴resolve到代碼工程裡,這些依賴應該是占這麼大空間的主要原因。(如果單靠代碼占了3.8G,那是有點兒夠瘋狂了)

最後,占top10的是本地maven倉庫3.7G。這點比較符合情理。

但是,結果并非盡如人意。首先,第一條資訊是無效的,因為家目錄包含了其他所有的目錄,它肯定是最大的。而且/home/pichu/.IntelliJIdea2017.3之是以能排到第四,純粹因為其子目錄system有8.2G,跟它本身大小并沒有什麼關系。同理,/home/pichu/Codes之是以能排進前十,也全靠它的子目錄/home/pichu/Codes/Java的大小。是以這種排序方式還是産生了一些無意義的排名。

是以,按照檔案夾大小排序有一定的效果,但還需結合其他方式。

最大獨立檔案夾top10

如果能夠看到某檔案夾自己本身的大小,而不包含其子檔案夾的大小,就不會出現上述不足之處了。

最大檔案夾top10(不包含子檔案夾的大小):

pichu@Archer ~ $ du -Sh ~ | sort -hr | head -
G     /home/pichu/VirtualBox VMs/Win7
G    /home/pichu/.IntelliJIdea2017./system/index/trigram.index
G    /home/pichu/.IntelliJIdea2017./system/Maven/Indices/Index5/data/context
G    /home/pichu/Public/windows
G    /home/pichu/.local/share/Trash/files
G    /home/pichu/.cache/netease-cloud-music/CachedSongs
M    /home/pichu/Pictures
M    /home/pichu/.IntelliJIdea2017./system/caches
M    /home/pichu/Downloads
M    /home/pichu/Codes/Java/uni-server/lib
           

-S, --separate-dirs

:僅顯示該目錄除掉子目錄之後的大小。

結論

這麼排序的結論就比較有說服力了。排第一的是windows7所在的檔案夾。其後是idea的一些配置檔案夾的大小。然後是1.1G的trash檔案(這個就是可以删除的)。接着是網易雲音樂的cache檔案、idea的cache、下載下傳的一些内容、某工程代碼的lib目錄(就是之前說的ant+ivy必須把代碼的依賴resolve本到工程下,是以才導緻Code目錄有3.8G)。

是以我們可以删掉trash檔案,删除cache等,清理出一部分磁盤空間。

當然這麼排序也有一些不足的地方,比如隻能看到idea的配置檔案夾下的 system/index/trigram.index 和 system/Maven/Indices/Index5/data0/context 比較占空間,但是整個.IntelliJIdea2017.3究竟占多大空間就不清楚了,這個資訊可以在上文的排序方式中看到。是以這兩種排序方式都有其存在的價值。

最大檔案top10

除了看檔案夾的大小,我們當然也很想找出最占空間的那些單檔案。

最大檔案top10:

[email protected] ~ $ find ~ -type f -exec du -h {} + | sort -rh | head -
G     /home/pichu/VirtualBox VMs/Win7/Win7_2rd.vdi
G    /home/pichu/.IntelliJIdea2017/system/index/trigram.index/Trigram.Index.storage.values
G    /home/pichu/.IntelliJIdea2017/system/Maven/Indices/Index5/data0/context/_77.cfs
G    /home/pichu/Public/windows/SW_DVD5_Office_Professional_Plus_2016_64Bit_ChnSimp_MLF_X20-ISO
M    /home/pichu/.local/share/Trash/files/java_error_in_IDEA.hprof
M    /home/pichu/Public/windows/Office_Professional_PlusVL_2010_x64_Activated.iso
M    /home/pichu/.IntelliJIdea2017/system/caches/content.dat.storageData
M    /home/pichu/tmp/CLion-.tar.gz
M    /home/pichu/Utils/druid/druid-/log/log-coordinator
M    /home/pichu/Utils/druid/druid--bin.tar.gz
           

find

:

-type

:指定尋找檔案類型的檔案。

f

代表普通檔案,

d

代表檔案夾等。

-exec

:傳遞參數,将

find

到的檔案傳遞給後面的

du

指令。

是以

find

指令加上

du

,在這裡所做的事情就是找到家目錄下所有的普通檔案(不包括目錄等),并以人類可讀的方式計算出所有檔案的大小。

然後再使用

sort

排序,

head

輸出前十。

結論

第一大檔案就是那個windows7虛拟機的虛拟硬碟檔案。然後是idea對代碼的索引檔案、idea對本地maven依賴的索引檔案、一個windows的office2016安裝檔案、trash檔案、office2010安裝檔案、下載下傳的一些安裝包等。

然後就可以删掉那些office安裝檔案、trash檔案、下載下傳的檔案包,給硬碟騰空間了。

附:find指令

格式

find [path] [expression]

按照檔案名查找

在/home目錄下查找以.txt結尾的檔案名:

find /home -name "*.txt"

-name

:後加shell模式的正規表達式,作為檔案名稱的比對模式。

在/home目錄下查找以.txt(忽略大小寫)結尾的檔案名:

find /home -iname "*.txt"

-iname

:同上,但忽略大小寫。

按照正規表達式比對檔案路徑

注意是比對檔案路徑! 這是對整個路徑的比對,不是搜尋檔案。例如,要比對名為

./fubar3

的檔案,可以使用正規表達式

.*bar.

或者

.*b.*3

,但是不能用

b.*r3

(因為路徑不是以

b

開頭的)。

find . -regex ".*\(\.txt|\.pdf\)$"

同上,但忽略大小寫:

find . -iregex ".*\(\.txt|\.pdf\)$"

按照檔案類型查找

  • f

    普通檔案
  • l

    符号連接配接
  • d

    目錄

一般用到的就這三種。

比如上文中,查找家目錄下的所有普通檔案:

find ~ -type f

按照目錄深度查找

-maxdepth levels

:進入指令行參數指定的目錄下層目錄時,最深不超過levels(一個非負整數) 層。

-maxdepth 0

意味着隻在指令行參數指定的目錄中執行測試和動作。

-mindepth levels

:不在levels(一個非負整數)層之内執行任何測試和動作。

-mindepth 1

意 味着處理所有的檔案,除了指令行參數指定的目錄中的檔案。

向下最大深度限制為3:

find . -maxdepth 3 -type f

搜尋出深度距離目前目錄至少2個子目錄的所有檔案:

find . -mindepth 2 -type f

按照檔案時間戳進行搜尋

UNIX/Linux檔案系統每個檔案都有三種時間戳:

- 通路時間(-atime/天,-amin/分鐘):使用者最近一次通路時間。

- 修改時間(-mtime/天,-mmin/分鐘):檔案最後一次修改時間。

- 變化時間(-ctime/天,-cmin/分鐘):檔案資料元(例如權限等)最後一次修改時間。

數字前正負号的意義:

-

+n

是比 n 大,

-

-n

是比 n 小,

-

n

正好是 n 。

尋找/dir下的七天前的所有檔案夾:

find /dir -type d -mtime +7

找出比hello.txt修改時間更新(即,更晚修改)的所有檔案:

find . -type f -newer hello.txt

-newer file

:對檔案的最近一次修改比 file 修改時間要晚。

按照檔案大小進行搜尋

  • k

    : KB
  • M

    : MB
  • G

    : GB

一般用到的就這三種。

搜尋Pictures下>10MB的檔案:

find Pictures -type f -size +10M

同時間,

+n

/

-n

/

n

分别代表

>n

/

<n

/正好為

n

查找條件或與非

expr1 邏輯詞 expr2

,其中expr代表

參數 值

,比如

-name "*.txt"

如果find多個expr之間不加邏輯詞,預設是使用

-and

。比如

find . -mtime +7 -type d

等同于

find . -mtime +7 -and -type d

:尋找目前目錄下修改時間在7天前的檔案夾。

目前目錄及子目錄下查找所有以.txt和.pdf結尾的檔案:

find . -name "*.txt" -or -name "*.pdf"

expr1 -or expr2

expr1 -and expr2

-not expr

邏輯非也可用

!

代替,如

find /home ! -name "*.txt"

等價于

find /home -not -name "*.txt"

優先級(先列出的優先級更高):

-

( expr )

-

! expr

或者

-not expr

-

expr1 expr2

或者

expr1 -a expr2

或者

expr1 -and expr2

-

expr1 -o expr2

或者

expr1 -or expr2

注意,當用括号強制優先級時:

find . \( -name "*.txt" -or -name "*.pdf" \)

,記得轉義,且括号要和指令之間留有空格。

示例:

找出目前檔案夾下七天前的檔案或目錄:

find . -type d -mtime +7 -or -type f -mtime +7

,預設添加了and:

-type d -and -mtime +7 -or -type f -and -mtime +7

。由于and優先級更高,是以相當于檢索條件為

(-type d -mtime +7) -or (-type f -mtime +7)

。這麼寫有些啰嗦,可以直接寫為

find . \( -type d -or -type f \) -mtime +7

參數傳遞

删除/dir下的七天前的所有檔案夾:

find /dir -type d -mtime +7 | xargs rm -rf

使用xargs将find到的結果傳遞給rm,删除檔案。

同理,還有

-exec

參數,如

find /dir -type d -mtime +7 -exec rm -rf {} \+

find /dir -type d -mtime +7 -exec rm -rf {} \;

可以起到和xargs相同的效果。

關于

;

+

的差別:可檢視 https://stackoverflow.com/a/6085237/7676237 。為了防止被shell直接解釋,通常給他們加上轉義符号,以防萬一。

其他

尋找大小為0的空檔案:

find ~ -type f -empty

-empty

檔案是空的普通檔案或者空目錄。

但是這些檔案也不要都直接删掉,因為很多這種檔案都是起到一個鎖的作用,作為一個辨別,代表某資源已被占用,進而保證同步性。比如:

./.IntelliJIdea2017/system/port.lock
./.IntelliJIdea2017/config/port.lock
           

繼續閱讀