Linux 使用ls列出目录及其总大小

Linux 使用ls列出目录及其总大小,linux,unix,Linux,Unix,在Unix中是否可以使用ls列出子目录及其所有内容的总大小,而不是通常的4K(我假定)仅列出目录文件本身 total 12K drwxrwxr-x 6 *** *** 4.0K 2009-06-19 10:10 branches drwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tags drwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk 在浏览了手册页之后,我的结果是空的。请查看du命令,然后尝试以下操作

在Unix中是否可以使用
ls
列出子目录及其所有内容的总大小,而不是通常的
4K
(我假定)仅列出目录文件本身

total 12K
drwxrwxr-x  6 *** *** 4.0K 2009-06-19 10:10 branches
drwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tags
drwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk

在浏览了手册页之后,我的结果是空的。

请查看
du
命令,然后尝试以下操作:

du -sh *
简短版本:

du --summarize --human-readable *
说明:
du
DiskUsage

-s
:显示每个指定文件的摘要。(相当于
-d0


-h
:“人类可读”输出。使用单位后缀:Byte、Kibibibyte(KiB)、Mebibyte(MiB)、Gibibibyte(GiB)、Tebibyte(TiB)和Pebibibyte(PiB)。(BASE2)

我总是使用
du-sk
-k
标志,以千字节为单位显示文件大小)

您需要的命令是'du-sk'du=“磁盘使用”

k标志以千字节为单位提供输出,而不是磁盘扇区(512字节块)的默认值


-s标志将只列出顶级目录中的内容(即默认情况下的当前目录或命令行上指定的目录)。奇怪的是,du在这方面的行为与ls相反。默认情况下,du将递归地向您提供每个子目录的磁盘使用情况。相反,ls将只提供指定目录中的列表文件。(ls-R提供递归行为。)

du-sk*| sort-n将按大小对文件夹进行排序。在寻找清理空间时很有用

du -sh * | sort -h

这将以人类可读的格式显示。

要递归显示当前目录的文件和子目录大小,请执行以下操作:

du -h .
要显示相同大小的信息而不递归打印其子目录(可能是一个巨大的列表),只需使用--max depth选项:


这些都是很好的建议,但我使用的是:

du -ksh * | sort -n -r
-ksh
确保文件和文件夹以人类可读的格式列出,并以兆字节、千字节等为单位。然后对它们进行数字排序,并反向排序,以便将较大的文件和文件夹放在第一位

此命令的唯一缺点是,计算机不知道千兆字节大于兆字节,因此它将仅按数字排序,您通常会发现如下列表:

120K
12M
4G
只要仔细看看这个装置就行了


此命令也适用于Mac(例如,
sort-h
不适用)。

du-sch*位于同一目录中。

要以
ls-lh
格式显示,请使用:

find . -maxdepth 1 -exec du --apparent-size --max-depth=0 --null '{}' ';' |\
  sort -k1 -nr --zero-terminated |\
  cut -f2 --zero-terminated |\
  xargs --null -n 1 du -h --apparent-size --max-depth=0
(du-sh./*;ls-lh--color=no){if($1==“total”){X=1}else如果(!X){size[$2]=$1}else{sub($5“[]*”,sprintf(%-7s),size[“/”$9]),$0);打印$0}
Awk代码说明:

if($1==“total”){//检测到ls开始时设置X
X=1
}否则,如果(!X){//直到设置了X,则从'du'收集大小`
尺码[$2]=$1
}否则{
//替换当前行上的尺寸(对齐)
sub($5“[]*”,sprintf(%-7s),尺寸[“/”$9]),0美元;
打印$0
}
样本输出:

drwxr-xr-x 2 root     root 4.0K    Feb 12 16:43 cgi-bin
drwxrws--- 6 root     www  20M     Feb 18 11:07 document_root
drwxr-xr-x 3 root     root 1.3M    Feb 18 00:18 icons
drwxrwsr-x 2 localusr www  8.0K    Dec 27 01:23 passwd

要以可读格式列出当前目录中最大的目录,请执行以下操作:

du-sh*| sort-hr

限制行数的更好方法是

du-sh*| sort-hr | head-n10

4.0K    /var/lock
4.0K    /var/run
4.0K    /var/www
12K     /var/spool
3.7M    /var/backups
33M     /var/log
45M     /var/webmin
231M    /var/cache
1.4G    /var/lib
1.7G    /var
其中,您可以增加
-n
标志的后缀,以限制列出的行数

样本:

[~]$ du -sh * | sort -hr
48M app
11M lib
6.7M    Vendor
1.1M    composer.phar
488K    phpcs.phar
488K    phpcbf.phar
72K doc
16K nbproject
8.0K    composer.lock
4.0K    README.md

阅读起来更方便:)

有一段时间,我使用Nautilus(RHEL 6.0上Gnome桌面上的)来删除我主文件夹中的文件,而不是使用bash中的
rm
命令。因此,显示的总大小为

du -sh
使用时,与每个子目录的磁盘使用量总和不匹配

du -sh *
我花了一段时间才意识到Nautilus会将删除的文件发送到它的垃圾箱文件夹,而该文件夹并没有列在
du-sh*
命令中。所以,我想分享一下,以防有人面临同样的问题

du -S
du还有另一个有用的选项:
-S,--separate dirs
告诉du不包括子目录的大小-在某些情况下很方便

示例1-仅显示目录中的文件大小:

du -Sh  * 
3,1G    10/CR2
280M    10
du -h  * 
3,1G    10/CR2 
3,4G    10
示例2-显示目录中的文件大小和子目录:

du -Sh  * 
3,1G    10/CR2
280M    10
du -h  * 
3,1G    10/CR2 
3,4G    10

如果要比较文件的大小,只需一个警告。du根据文件系统、块大小等产生不同的结果

文件的大小可能不同,例如,比较本地硬盘上的同一目录和USB大容量存储设备。我使用以下脚本(包括ls)来汇总目录大小。将所有子目录都考虑在内,结果以字节为单位

echo "[GetFileSize.sh] target directory: \"$1\""

iRetValue=0

uiLength=$(expr length "$1")
if [ $uiLength -lt 2 ]; then
  echo "[GetFileSize.sh] invalid target directory: \"$1\" - exiting!"
  iRetValue=-1
else
  echo "[GetFileSize.sh] computing size of files..."

  # use ls to compute total size of all files - skip directories as they may
  # show different sizes, depending on block size of target disk / file system
  uiTotalSize=$(ls -l -R $1 | grep -v ^d | awk '{total+=$5;} END {print total;}')
  uiLength=$(expr length "$uiTotalSize")
  if [ $uiLength -lt 1 ]; then
    uiTotalSize=0
  fi
  echo -e "[GetFileSize.sh] total target file size: \"$uiTotalSize\""

fi

exit "$iRetValue"

嗯,最好的方法是使用这个命令:

du -h -x / | sort -hr >> /home/log_size.txt

然后,您将能够在所有服务器上获取所有大小的文件夹。很容易帮助您找到最大的大小。

我遇到了一个类似于Martin Wilde所描述的问题,在我的例子中,在使用rsync镜像后,比较两个不同服务器上的相同目录

我没有使用脚本,而是将
-b
标志添加到
du
中,该标志以字节为单位计算大小,并尽我所能消除两台服务器上的差异。您仍然可以使用
-s-h
获得可理解的输出。

du-sm*| sort-nr


按大小输出键入“ls-ltrh/path\u to\u目录”

将此shell函数声明放入shell初始化脚本中:

function duls {
    paste <( du -hs -- "$@" | cut -f1 ) <( ls -ld -- "$@" )
}
说明:

paste
实用程序根据您给定的规范从其输入创建列。给定两个输入文件,它将它们并排放置,并用一个选项卡作为分隔符

我们将
du-hs--“$@”cut-f1
的输出作为第一个文件(输入流),将
ls-ld--“$@”的输出作为第二个文件

ls -ltrapR
duh() {
  # shows disk utilization for a path and depth level
  path="${1:-$PWD}"
  level="${2:-0}"
  du "$path" -h --max-depth="$level"
}
$ du -ht 1000000000 | sort --reverse
$ du -ht 1G | sort --reverse
sudo apt install ncdu
ncdu
ncdu --exclude-kernfs -x /
brew install ncdu
cd /
ncdu --exclude-firmlinks
ncdu -o ncdu.json
ncdu -f ncdu.json
ncdu -o -  | python -m json.tool | less
[
    1,
    0,
    {
        "progname": "ncdu",
        "progver": "1.12",
        "timestamp": 1562151680
    },
    [
        {
            "asize": 4096,
            "dev": 2065,
            "dsize": 4096,
            "ino": 9838037,
            "name": "/work/linux-kernel-module-cheat/submodules/linux"
        },
        {
            "asize": 1513,
            "dsize": 4096,
            "ino": 9856660,
            "name": "Kbuild"
        },
        [
            {
                "asize": 4096,
                "dsize": 4096,
                "ino": 10101519,
                "name": "net"
            },
            [
                {
                    "asize": 4096,
                    "dsize": 4096,
                    "ino": 11417591,
                    "name": "l2tp"
                },
                {
                    "asize": 48173,
                    "dsize": 49152,
                    "ino": 11418744,
                    "name": "l2tp_core.c"
                },
ls -ltr | head -n1 | cut -d' ' -f2
find . -maxdepth 1 -exec du --apparent-size --max-depth=0 --null '{}' ';' |\
  sort -k1 -nr --zero-terminated |\
  cut -f2 --zero-terminated |\
  xargs --null -n 1 du -h --apparent-size --max-depth=0