Linux 如何在Bash中列出每个文件和目录的大小并按大小降序排序?

Linux 如何在Bash中列出每个文件和目录的大小并按大小降序排序?,linux,file,bash,Linux,File,Bash,我发现在Bash中没有一种容易获得目录大小的方法 我希望当我键入ls-时,它可以同时递归地列出目录和文件的所有文件大小之和,并按大小顺序排序 这可能吗?ls-S按大小排序。然后,为了也显示大小,ls-ls给出一个长(-l),按大小排序(-S)显示。我通常也会添加-h,以便于阅读,因此,ls-lhS du -s -- * | sort -n (这不会显示隐藏的(.dotfiles)文件) 使用du-sm表示Mb单位等。我总是使用 du -smc -- * | sort -n 因为明显的原因,总

我发现在Bash中没有一种容易获得目录大小的方法

我希望当我键入
ls-
时,它可以同时递归地列出目录和文件的所有文件大小之和,并按大小顺序排序


这可能吗?

ls-S
按大小排序。然后,为了也显示大小,
ls-ls
给出一个长(
-l
),按大小排序(
-S
)显示。我通常也会添加
-h
,以便于阅读,因此,
ls-lhS

du -s -- * | sort -n
(这不会显示隐藏的(.dotfiles)文件)

使用
du-sm
表示Mb单位等。我总是使用

du -smc -- * | sort -n
因为明显的原因,总行(
-c
)将位于底部:)

附言:
  • 请参阅有关处理dot文件的注释
  • 我经常使用例如“du-smc/home/| sort-n | tail”来了解大件的确切位置

    • 我想我可能已经知道你想做什么了。这将给出所有文件和所有目录的排序列表,按文件大小和目录中内容的大小排序

      (find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n
      
      [增强版]
      这将比下面的初始版本更快、更精确,并将输出当前目录中所有文件大小的总和:

      echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
      
      文件上的
      stat-c%s
      命令将返回其大小(以字节为单位)。这里的
      tr
      命令用于克服
      xargs
      命令的限制(显然,管道到
      xargs
      会在更多行上分割结果,破坏我命令的逻辑)。因此,
      tr
      负责将换行符替换为
      +
      (加号)
      sed
      的唯一目标是从结果字符串中删除最后一个
      +
      符号,以避免最后一个
      bc
      (基本计算器)命令像往常一样进行计算时出现抱怨

      性能:我在几个目录和超过150000个文件(我的fedora 15盒的当前文件数)上测试了它,我认为这是一个惊人的结果:

      # time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
      12671767700
      
      real    2m19.164s
      user    0m2.039s
      sys 0m14.850s
      
      如果您想与
      du-sb/
      命令进行比较,它将以字节为单位输出估计的磁盘使用量(
      -b
      选项)

      正如我所期望的那样,它比我的命令计算稍微大一点,因为
      du
      实用程序返回每个文件的分配空间,而不是实际消耗的空间

      [初始版本]
      如果需要知道文件夹的确切总大小,则不能使用
      du
      命令,因为(根据手册页引用)
      du
      估计文件空间使用情况。因此,它将导致错误的结果,近似值(可能接近总和大小,但很可能大于您正在寻找的实际大小)

      我想可能有不同的方法来回答你的问题,但这是我的:

      ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc
      
      它会在下查找所有文件。目录(更改。使用您喜欢的任何目录),还包括隐藏文件(使用
      xargs
      )并在一行中输出它们的名称,然后使用
      ls-l
      生成详细列表。这个(有时)巨大的输出通过管道传输到cut命令,只有第五个字段(
      -f5
      )被获取,这是以字节为单位的文件大小,然后再次通过管道传输到
      xargs
      ,这再次产生一行由空格分隔的大小。现在进行一个sed魔术,用加号(
      +
      )替换每个空格,最后由
      bc
      (基本计算器)进行计算


      它可能需要额外的调优,并且您可能有
      ls
      命令抱怨参数列表太长。

      另一个简单的解决方案

      $ for entry in $(ls); do du -s "$entry"; done | sort -n
      
      结果看起来像

      2900    tmp
      6781    boot
      8428    bin
      24932   lib64
      34436   sbin
      90084   var
      106676  etc
      125216  lib
      3313136 usr
      4828700 opt
      

      将“du-s”更改为“du-sh”将显示人类可读的大小,但我们无法使用此方法进行排序。

      只需导航到目录并运行以下命令:

      du -a --max-depth=1 | sort -n
      
      或者添加-h表示人类可读的大小,添加-r表示首先打印更大的目录/文件

      du -a -h --max-depth=1 | sort -hr
      
      命令 输出 解释
      • du
        显示“磁盘使用情况”
      • h
        表示“人类可读”(排序和du)
      • max depth=0
        表示
        du
        不会显示子文件夹的大小(如果要显示每个子文件夹、子文件夹、子文件夹中每个文件的所有大小,请删除该选项)
      • r
        表示“反向”(首先是最大的文件)
      ncdu 当我谈到这个问题时,我想清理一下我的文件系统。命令行工具
      ncdu
      更适合此任务

      Ubuntu上的安装:

      $ sudo apt-get install ncdu
      
      用法:

      只需在命令行中键入
      ncdu[path]
      。分析路径几秒钟后,您将看到如下内容:

      $ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
      --- / ---------------------------------------------------------
      .  96,1 GiB [##########] /home
      .  17,7 GiB [#         ] /usr
      .   4,5 GiB [          ] /var
          1,1 GiB [          ] /lib
        732,1 MiB [          ] /opt
      . 275,6 MiB [          ] /boot
        198,0 MiB [          ] /storage
      . 153,5 MiB [          ] /run
      .  16,6 MiB [          ] /etc
         13,5 MiB [          ] /bin
         11,3 MiB [          ] /sbin
      .   8,8 MiB [          ] /tmp
      .   2,2 MiB [          ] /dev
      !  16,0 KiB [          ] /lost+found
          8,0 KiB [          ] /media
          8,0 KiB [          ] /snap
          4,0 KiB [          ] /lib64
      e   4,0 KiB [          ] /srv
      !   4,0 KiB [          ] /root
      e   4,0 KiB [          ] /mnt
      e   4,0 KiB [          ] /cdrom
      .   0,0   B [          ] /proc
      .   0,0   B [          ] /sys
      @   0,0   B [          ]  initrd.img.old
      @   0,0   B [          ]  initrd.img
      @   0,0   B [          ]  vmlinuz.old
      @   0,0   B [          ]  vmlinuz
      

      用d删除当前突出显示的元素,用CTRL+c退出。您可以使用下面的按大小列出文件 du-h | sort-hr |更多 或
      du-h--max depth=0*| sort-hr | more

      我倾向于以一种简单的方式使用du

      du -sh */ | sort -n
      
      这使我了解了哪些目录占用的空间最多。然后我可以在以后运行更精确的搜索。

      显然
      --max depth
      选项不在Mac OS X版本的
      du
      命令中。您可以使用以下选项

      du-h-d1 | sort-n
      简单快速:

      find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n
      

      *需要。

      啊,对不起,你的帖子里不清楚。你想要
      du
      ,好像有人把它贴出来了@sehe:取决于你对real的定义——它显示了目录用来存储自身的空间量。(这不仅仅是增加子条目的大小。)它不是一个随机数,也不总是4KB。你所说的目录的“大小”到底是什么意思?它下的文件数(递归还是非递归)?其下文件大小的总和(递归还是非递归)?目录本身的磁盘大小?(目录被实现为包含文件的特殊文件
      $ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
      --- / ---------------------------------------------------------
      .  96,1 GiB [##########] /home
      .  17,7 GiB [#         ] /usr
      .   4,5 GiB [          ] /var
          1,1 GiB [          ] /lib
        732,1 MiB [          ] /opt
      . 275,6 MiB [          ] /boot
        198,0 MiB [          ] /storage
      . 153,5 MiB [          ] /run
      .  16,6 MiB [          ] /etc
         13,5 MiB [          ] /bin
         11,3 MiB [          ] /sbin
      .   8,8 MiB [          ] /tmp
      .   2,2 MiB [          ] /dev
      !  16,0 KiB [          ] /lost+found
          8,0 KiB [          ] /media
          8,0 KiB [          ] /snap
          4,0 KiB [          ] /lib64
      e   4,0 KiB [          ] /srv
      !   4,0 KiB [          ] /root
      e   4,0 KiB [          ] /mnt
      e   4,0 KiB [          ] /cdrom
      .   0,0   B [          ] /proc
      .   0,0   B [          ] /sys
      @   0,0   B [          ]  initrd.img.old
      @   0,0   B [          ]  initrd.img
      @   0,0   B [          ]  vmlinuz.old
      @   0,0   B [          ]  vmlinuz
      
      du -sh */ | sort -n
      
      find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n