- 檢視占用情況
- 最大檔案夾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。
:human-readable,以人類可讀的方式顯示,即顯示為K、M、G等機關。一般
-h
都是顯示help,但是和大小相關的一般都是以人類可讀的方式輸出大小。
-h
home下也就我一個人在用,是以65個G全是我占用的。
pichu@Archer ~ $ du -hd /home
G /home/pichu
G /home
:human-readable,同上。
-h
-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
:
:逆序排列。本來對數字排序應該是1在前,2在後,現在反過來了。
-r, --reverse
:既然顯示檔案大小的指令,
-h, --human-numeric-sort
代表人類可讀的方式輸出檔案大小,那麼sort指令自然是以人類可讀的數字去排序。
-h
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
按照目錄深度查找
:進入指令行參數指定的目錄下層目錄時,最深不超過levels(一個非負整數) 層。
-maxdepth levels
意味着隻在指令行參數指定的目錄中執行測試和動作。
-maxdepth 0
:不在levels(一個非負整數)層之内執行任何測試和動作。
-mindepth 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 修改時間要晚。
按照檔案大小進行搜尋
-
: KBk
-
: MBM
-
: GBG
一般用到的就這三種。
搜尋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