是否有任何ls
参数可以用来显示目录的文件大小以及。
当我这样做时ls -s
,它会显示block-size
(始终 4k)而不是目录大小。
谢谢你!!!
编辑-部分成就
正如 @Arronical 所说,Commanddu -sh *
显示文件和目录及其大小。我正在寻找的一个小改进是像节目中那样以不同的颜色显示目录ls
。有什么想法吗?谢谢。:-)
答案1
我不知道该ls
命令的任何参数可以实现这一点,但可以使用该du
命令找到当前工作目录中目录和文件的大小。
尝试使用:
du -sh ./*
应该可以创建一个函数或脚本,为您提供有关正在显示信息的文件还是目录的信息。
作为穆鲁指出,带有参数 1 的-d
or--max-depth
选项对于仅列出目录很有用。它还可以解决隐藏目录无法通过常规 shell 通配符列出这一事实(部分./*
)。
答案2
基本思想
可以模拟ls -l
find。例如,像使用将针对找到的每个目录和文件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
表示这是一个普通文件,开头的“ d
in”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 一切皆文件,而在现实目录中有一个文件,其中包含与之链接的文件列表。因此,stat
和ls
给出该特殊文件的大小,而不是链接到目录的所有文件的总和。但这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