命令“ls”显示目录大小而不是块大小

命令“ls”显示目录大小而不是块大小

是否有任何ls参数可以用来显示目录的文件大小以及

当我这样做时ls -s,它会显示block-size(始终 4k)而不是目录大小。

谢谢你!!!

编辑-部分成就

正如 @Arronical 所说,Commanddu -sh *显示文件和目录及其大小。我正在寻找的一个小改进是像节目中那样以不同的颜色显示目录ls。有什么想法吗?谢谢。:-)

答案1

我不知道该ls命令的任何参数可以实现这一点,但可以使用该du命令找到当前工作目录中目录和文件的大小。

尝试使用:

du -sh ./*

应该可以创建一个函数或脚本,为您提供有关正在显示信息的文件还是目录的信息。

作为穆鲁指出,带有参数 1 的-dor--max-depth选项对于仅列出目录很有用。它还可以解决隐藏目录无法通过常规 shell 通配符列出这一事实(部分./*)。

答案2

基本思想

可以模拟ls -lfind。例如,像使用将针对找到的每个目录和文件find运行的命令一样:du

find . -maxdepth 1  ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null 

示例输出(附注,这里我使用-type d显示目录列表仅用于演示目的;此命令不会-type d列出所有文件和目录):

DIR:/xieerqi
skolodya@ubuntu:$ find . -maxdepth 1 -type d ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null | head      
drwxrwxr-x xieerqi xieerqi 348K ./addRemoveDistribution
drwxr-xr-x xieerqi xieerqi 2.2G ./Downloads
drwxrwxr-x xieerqi xieerqi 4.0K ./.screenlayout
drwxr-xr-x xieerqi xieerqi 4.0K ./Public
drwxrwxr-x xieerqi xieerqi 28K  ./Youku Files
drwxrwxr-x xieerqi xieerqi 142M ./.minecraft
drwx------ xieerqi xieerqi 20K  ./.gnupg
drwxrwxr-x xieerqi xieerqi 2.5G ./.Genymobile
drwxrwxr-x xieerqi xieerqi 73M  ./genymotion
drwxrwxr-x xieerqi xieerqi 104K ./scripts

笔记find-ls旗帜,我不是在这里使用,出于与 OP 所述相同的原因 - 它显示规范的 4096 字节

简化

此命令本身可以转换为别名,类似于ls2或函数,然后也可以接受$1参数。例如,这是我放入我的命令.bashrc以及它的工作原理:

function lscwd
{
 # Function to stat files and folders in current dir
 # Takes first argument as directory to stat
 # If no directory supplied, current dir assumed
 if [ -z "$1" ];then
   DIR="."
 else
   DIR="$1"
 fi

 find "$DIR"  -maxdepth 1 ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null 

}

样本运行:

DIR:/xieerqi
skolodya@ubuntu:$ lsc
lscpu lscwd 
skolodya@ubuntu:$ lscwd | head                                                                                               
drwxrwxr-x xieerqi xieerqi 348K ./addRemoveDistribution
drwxr-xr-x xieerqi xieerqi 2.2G ./Downloads
drwxrwxr-x xieerqi xieerqi 4.0K ./.screenlayout
drwxr-xr-x xieerqi xieerqi 4.0K ./Public
drwxrwxr-x xieerqi xieerqi 28K  ./Youku Files
drwxrwxr-x xieerqi xieerqi 142M ./.minecraft
drwx------ xieerqi xieerqi 20K  ./.gnupg
drwxrwxr-x xieerqi xieerqi 2.5G ./.Genymobile
drwxrwxr-x xieerqi xieerqi 73M  ./genymotion
drwxrwxr-x xieerqi xieerqi 104K ./scripts

DIR:/xieerqi
skolodya@ubuntu:$ lscwd /etc | head                                                                                          
drwxr-xr-x root root 18M    /etc
drwxr-xr-x root root 68K    /etc/logrotate.d
drwxr-xr-x root root 36K    /etc/apm
drwxr-xr-x root root 96K    /etc/speech-dispatcher
drwxr-xr-x root root 28K    /etc/jwm
drwxr-xr-x root root 8.0K   /etc/hp
drwxr-xr-x root root 8.0K   /etc/gtk-2.0
drwxr-xr-x root root 20K    /etc/gtkmathview
drwxr-xr-x root root 68K    /etc/xml
drwxr-xr-x root root 8.0K   /etc/esound

输出组织

没有办法在 中本机地为输出着色find,它是专门为解析文件名而设计的。ls颜色来自输出中包含的特殊字符,而这并不是我们真正想要的。

但是,我们可以读取权限。开头的-“in”-rwxr-xr-x表示这是一个普通文件,开头的“ din”drwxr-xr-x表示目录。

find还有一个方便的-type标志,我们也可以用它来过滤输出。例如,这是编辑后的版本lscwd

function lscwd2
{
 # Function to stat files and folders in current dir
 # Takes first argument as directory to stat
 # If no directory supplied, current dir assumed
 if [ -z "$1" ];then
   DIR="."
 else
   DIR="$1"
 fi

 # print directories first
 printf "*** DIRECTORIES *** \n"
 find "$DIR"  -maxdepth 1 -type d ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null 
 # print non-directories second
 printf "*** FILES *** \n"

 find "$DIR"  -maxdepth 1 ! -type d ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null 
 }

示例输出:

DIR:/bin
skolodya@ubuntu:$ lscwd2
*** DIRECTORIES *** 
drwxrwxr-x xieerqi xieerqi 4.0K ./c
drwxrwxr-x xieerqi xieerqi 12K  ./python
drwxrwxr-x xieerqi xieerqi 12K  ./perl
drwxrwxr-x xieerqi xieerqi 4.0K ./ANOTHERDIR
drwxrwxr-x xieerqi xieerqi 4.0K ./random
drwxrwxr-x xieerqi xieerqi 108K ./sh
drwxrwxr-x xieerqi xieerqi 38M  ./cs2
drwxr-xr-x xieerqi xieerqi 414M ./arduino-1.6.7
drwxrwxr-x xieerqi xieerqi 24K  ./codereview
*** FILES *** 
-rwxrwxr-x xieerqi xieerqi 4.0K ./preventShutdown.sh
-rw-rw-r-- xieerqi xieerqi 4.0K ./Dimmer.desktop
-rwxrwxr-x xieerqi xieerqi 4.0K ./updateWarning.sh
-rw-rw-r-- xieerqi xieerqi 4.0K ./somefile.txt
-rw-r--r-- xieerqi xieerqi 4.0K ./.bashrc
-rwxr-xr-x xieerqi xieerqi 4.0K ./setup.sh
-rwxrwxr-x xieerqi xieerqi 4.0K ./whiledemo.csh
-rwxr-xr-x xieerqi xieerqi 4.0K ./fmtcode.awk
-rwxrwxr-x xieerqi xieerqi 4.0K ./batmon.sh
-rwxr-xr-x xieerqi xieerqi 4.0K ./Dimmer.sh
-rw-rw-r-- xieerqi xieerqi 4.0K ./somefile2.txt

输出有时会非常长,因此我建议将此功能与less分页实用程序结合使用。只需像这样管道输出即可lscwd2 | less

关于 ls 和 stat

为什么人们总是建议du?izx他的回答简短而精彩我尽可能地解释得更清楚,但简而言之,Unix 和 Linux 一切皆文件,而在现实目录中有一个文件,其中包含与之链接的文件列表。因此,statls给出该特殊文件的大小,而不是链接到目录的所有文件的总和。但这du正是解决问题的关键。请注意 中的描述man du

总结每个文件的磁盘使用情况,以目录为单位递归。

du实用程序会跳转到每个目录并计算每个文件的大小。与所做的事情ls大不相同stat

因此,每个实用程序的目的都非常不同。ls它正在执行所要求的操作 - 列出文件大小,而从 Windows 世界来看,我们将目录的大小理解为这个“袋子”,其大小取决于其中的苹果数量,如果我可以将其用于比较的话。Unix 略有不同,是的,但它是现实的。也许它并没有那么迎合用户的需求,但它在实际的物理意义上是有意义的。

顺便提一下,块大小默认为 4k,但一旦文件超过 4k,文件系统就需要分配更多空间。例如,我的主文件夹的所有文件总大小为 73GB。目录的块大小呢?

DIR:/bin
skolodya@ubuntu:$ ls -ld $HOME
drwxr-xr-x 94 xieerqi xieerqi 16384 Jan 22 07:24 /home/xieerqi/

答案3

解析的输出ls总是会导致悲伤。参见这个解释. 请使用stat( man stat)。

man stat

NAME
       stat - display file or file system status

SYNOPSIS
       stat [OPTION]... FILE...

DESCRIPTION
       Display file or file system status.
...

       %b     number of blocks allocated (see %B)

       %B     the size in bytes of each block reported by %b
...
       %n     file name

下面是一个在我的系统上 YMMV 的示例:

$ stat --format="%n %b %B" .bashrc $HOME
.bashrc 32 512
/home/w3 192 512

相关内容