是否有可能在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

在翻遍了手册之后,我一无所获。


当前回答

ndu (ncurses du)

这个很棒的CLI实用程序允许您轻松地交互式地查找大文件和目录(递归总大小)。

例如,我们在一个著名的开源项目的根目录中:

sudo apt install ncdu
ncdu

结果是:

然后,我在键盘上向下输入,进入/drivers文件夹,我看到:

Ncdu只在整个树启动时递归地计算文件大小,所以它是高效的。这样,当您在子目录内移动时,就不必重新计算大小,因为您试图确定磁盘占用是什么。

“总磁盘使用量”vs“表观大小”类似于du,我已经解释了它:为什么' du '的输出经常与' du -b '如此不同

项目主页:https://dev.yorhel.nl/ncdu

相关问题:

https://unix.stackexchange.com/questions/67806/how-to-recursively-find-the-amount-stored-in-directory/67808 https://unix.stackexchange.com/questions/125429/tracking-down-where-disk-space-has-gone-on-linux https://askubuntu.com/questions/57603/how-to-list-recursive-file-sizes-of-files-and-directories-in-a-directory https://serverfault.com/questions/43296/how-does-one-find-which-files-are-taking-up-80-of-the-space-on-a-linux-webserve

在Ubuntu 16.04中测试。

Ubuntu列表根目录

你可能想要:

ncdu --exclude-kernfs -x /

地点:

-x停止跨文件系统屏障 ——exclude-kernfs跳过特殊的文件系统,比如/sys

MacOS 10.15.5 list root

为了正确地在该系统上列出root /,我还需要——exclude-firmlinks,例如:

brew install ncdu
cd /
ncdu --exclude-firmlinks

否则,它似乎进入了一些链接无限循环,可能是因为:https://www.swiftforensics.com/2019/10/macos-1015-volumes-firmlink-magic.html

我们为了爱而学习的东西。

Ncdu非交互用法

ncdu的另一个很酷的特性是,您可以先以JSON格式转储大小,然后再重用它们。

例如,要生成文件,运行:

ncdu -o ncdu.json

然后用互动的方式检查它:

ncdu -f ncdu.json

如果您正在处理一个非常大而缓慢的文件系统,如NFS,这是非常有用的。

通过这种方式,您可以首先只导出一次,这可能需要几个小时,然后浏览文件、退出、再次浏览等等。

输出格式只是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"
                },

在Ubuntu 18.04中测试。

其他回答

这里需要注意的是,du给出的是磁盘使用率。不同的机器可以使用不同的块大小,因此在一台机器上一个块可以是4096字节,而另一台机器可以包含2048字节的块大小。如果我在一台使用4096字节块的机器中放入10个1字节文件,在一台使用2048字节块的机器中放入10个1字节文件,du -h将分别报告~40k和~20k。

如果你想知道一个目录中所有文件的大小,对于每个目录,你可以这样做:

for x in ./*;
do
    if [[ -f "$x" ]]; then
        ls -al "$x"
    fi
done | awk '{print $6}' | awk '{s+=$1}END{print s}'

这将为您提供目录中所有文件的总大小。

Du -sch *在同一目录下。

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

du -ksh * | sort -n -r

-ksh确保文件和文件夹以人类可读的格式列出,并以兆字节、千字节等为单位。然后你对它们进行数值排序,然后反转排序,让大的放在前面。

这个命令唯一的缺点是,计算机不知道千兆字节比兆字节大,所以它只会按数字排序,你经常会发现这样的列表:

120K
12M
4G

只是要仔细观察单位。

该命令也适用于Mac(而sort -h则不能)。

ndu (ncurses du)

这个很棒的CLI实用程序允许您轻松地交互式地查找大文件和目录(递归总大小)。

例如,我们在一个著名的开源项目的根目录中:

sudo apt install ncdu
ncdu

结果是:

然后,我在键盘上向下输入,进入/drivers文件夹,我看到:

Ncdu只在整个树启动时递归地计算文件大小,所以它是高效的。这样,当您在子目录内移动时,就不必重新计算大小,因为您试图确定磁盘占用是什么。

“总磁盘使用量”vs“表观大小”类似于du,我已经解释了它:为什么' du '的输出经常与' du -b '如此不同

项目主页:https://dev.yorhel.nl/ncdu

相关问题:

https://unix.stackexchange.com/questions/67806/how-to-recursively-find-the-amount-stored-in-directory/67808 https://unix.stackexchange.com/questions/125429/tracking-down-where-disk-space-has-gone-on-linux https://askubuntu.com/questions/57603/how-to-list-recursive-file-sizes-of-files-and-directories-in-a-directory https://serverfault.com/questions/43296/how-does-one-find-which-files-are-taking-up-80-of-the-space-on-a-linux-webserve

在Ubuntu 16.04中测试。

Ubuntu列表根目录

你可能想要:

ncdu --exclude-kernfs -x /

地点:

-x停止跨文件系统屏障 ——exclude-kernfs跳过特殊的文件系统,比如/sys

MacOS 10.15.5 list root

为了正确地在该系统上列出root /,我还需要——exclude-firmlinks,例如:

brew install ncdu
cd /
ncdu --exclude-firmlinks

否则,它似乎进入了一些链接无限循环,可能是因为:https://www.swiftforensics.com/2019/10/macos-1015-volumes-firmlink-magic.html

我们为了爱而学习的东西。

Ncdu非交互用法

ncdu的另一个很酷的特性是,您可以先以JSON格式转储大小,然后再重用它们。

例如,要生成文件,运行:

ncdu -o ncdu.json

然后用互动的方式检查它:

ncdu -f ncdu.json

如果您正在处理一个非常大而缓慢的文件系统,如NFS,这是非常有用的。

通过这种方式,您可以首先只导出一次,这可能需要几个小时,然后浏览文件、退出、再次浏览等等。

输出格式只是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"
                },

在Ubuntu 18.04中测试。

从ls中只检索以字节为单位的大小。

ls -ltr | head -n1 | cut -d' ' -f2