Command-Line

列出一個目錄,包括子目錄,以及文件計數和累積大小

  • November 27, 2013

有沒有辦法列出目錄的內容,包括帶有文件數和累積大小的子目錄?

我想看看:

  • 目錄數
  • 子目錄數
  • 文件數
  • 累計規模

如果我對你的理解正確,這會給你想要的:

find /path/to/target -type d | while IFS= read -r dir; do 
 echo -ne "$dir\tsize: $(du -sh "$dir" | cut -f 1)" 
 echo -ne "\tsubdirs: $(find "$dir" -mindepth 1 -type d | wc -l)"
 echo -e "\tfiles: $(find "$dir" -type f | wc -l )";
done  | tac

/boot例如,如果你在上面執行它,你會得到如下輸出:

/boot/burg/themes/sora_extended size: 8.0K  subdirs: 0  files: 1
/boot/burg/themes/radiance/images   size: 196K  subdirs: 0  files: 48
/boot/burg/themes/radiance  size: 772K  subdirs: 1  files: 53
/boot/burg/themes/winter    size: 808K  subdirs: 0  files: 35
/boot/burg/themes/icons size: 712K  subdirs: 0  files: 76
/boot/burg/themes   size: 8.9M  subdirs: 26 files: 440
/boot/burg/fonts    size: 7.1M  subdirs: 0  files: 74
/boot/burg  size: 20M   subdirs: 29 files: 733
/boot/grub/locale   size: 652K  subdirs: 0  files: 17
/boot/grub  size: 4.6M  subdirs: 1  files: 224
/boot/extlinux/themes/debian-wheezy/extlinux    size: 732K  subdirs: 0  files: 11
/boot/extlinux/themes/debian-wheezy size: 1.5M  subdirs: 1  files: 22
/boot/extlinux/themes   size: 1.5M  subdirs: 2  files: 22
/boot/extlinux  size: 1.6M  subdirs: 3  files: 28
/boot/  size: 122M  subdirs: 36 files: 1004

要輕鬆訪問此命令,您可以將其轉換為函式。將這些行添加到 shell 的初始化文件(~/.bashrc對於 bash):

dirsize(){
   find "$1" -type d | while IFS= read -r dir; do 
   echo -ne "$dir\tsize: $(du -sh "$dir"| cut -f 1)" 
   echo -ne "\tsubdirs: $(find "$dir" -mindepth 1 -type d | wc -l)"
   echo -e "\tfiles: $(find "$dir" -maxdepth 1 -type f | wc -l )";
   done  | tac
}

您現在可以將其作為dirsize /path/.


解釋

上面的函式有5個主要部分:

  1. find /path/to/target -type d | while IFS= read -r dir; do ... ; done:這將通過將變數設置為其名稱來查找/path/to/target並處理每個目錄下的所有目錄。dir確保這IFS=不會在名稱中帶有空格的目錄上中斷。
  2. echo -ne "$dir\tsize: $(du -sh "$dir" | cut -f 1)":這使用命令du來獲取目錄的大小並cut僅列印du.
  3. echo -ne "\tsubdirs: $(find "$dir" -mindepth 1 -type d | wc -l)": 這個 find 命令查找$dir. type -d確保我們只找到目錄,沒有文件,並確保-mindepth我們不計算目前目錄,..
  4. echo -e "\tfiles: $(find "$dir" -maxdepth 1 -type f | wc -l)";: 這個查找文件 ( -type f) 是直接( -maxdepth 1) 下的$dir。它不會計算$d.
  5. | tac:最後,整個事情都通過了tac,它只是顛倒了列印行的順序。這意味著目標目錄的總大小將顯示為最後一行。如果這不是您想要的,只需刪除| tac.

引用自:https://unix.stackexchange.com/questions/102788