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

We *_*org 1 command-line bash 12.04 14.04

有什么ls我可以用它来显示文件大小为目录参数以及

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

谢谢!!!

编辑 - 部分成就

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

Arr*_*cal 6

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

尝试使用:

du -sh ./*
Run Code Online (Sandbox Code Playgroud)

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

正如穆鲁指出的那样,参数为 1的-dor--max-depth选项对于仅列出目录很有用。它还可以解决隐藏目录未通过正常 shell globbing(./*部分)列出的事实。

  • 代替`./*`,使用`-d1`:`du -hxd1 .`,例如,只显示目录 (2认同)

Ser*_*nyy 5

基本思路

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

find . -maxdepth 1  ! -name "."   -printf "%M %u %g "  -exec du -sh  {} \; 2> /dev/null 
Run Code Online (Sandbox Code Playgroud)

示例输出(附注,此处我-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
Run Code Online (Sandbox Code Playgroud)

注意find-ls标志,我在这里没有使用它,原因与OP所述相同 - 它显示规范的4096字节

简化

这个命令本身可以变成一个别名,比如ls2一个函数,然后它也可以接受$1参数。例如,这是我放入 my 中的内容.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 

}
Run Code Online (Sandbox Code Playgroud)

样本运行:

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
Run Code Online (Sandbox Code Playgroud)

输出组织

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

然而,人们可以读取权限。前导-表示-rwxr-xr-x是普通文件,前导d表示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 
 }
Run Code Online (Sandbox Code Playgroud)

和示例输出:

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
Run Code Online (Sandbox Code Playgroud)

输出有时可能非常长,因此我建议将此函数与less分页实用程序结合使用。像这样通过管道输出lscwd2 | less

关于 ls 和 stat

为什么人们总是建议du?izx 在他简短而精彩的回答中解释得比我更好,但简而言之,在Unix 和 Linux 上一切都是文件,而在现实目录中是一个文件,其中包含链接到它的文件列表。因此,stat给出该特殊文件的大小ls,而不是链接到该目录的所有文件的总数。但这才是拯救世界的关键。请注意中的描述:duman du

对目录递归地总结每个文件的磁盘使用情况。

du实用程序跳转到每个目录并总结其中每个文件的文件大小。与“做什么”lsstat“做”有很大不同。

因此,每个实用程序的目的都非常不同。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/
Run Code Online (Sandbox Code Playgroud)