暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何在 Linux 命令行中按大小对文件进行排序

TIAP 2022-07-25
871

ls 命令用于显示目录的内容。使用 -l 选项,可以列出文件和目录及其属性。前段时间我们分享过一篇关于 ls -lrt 命令的文章,可以将文件列表按照修改时间进行排序,具体可参考:你会用 ls -lrt 命令吗?

今天我们来分享一下如何根据文件大小对列表进行排序。

ls -l 命令可以显示文件大小,但也仅仅是能让我们看到文件的大小,它默认是按照字母顺序显示的,不能按照文件大小进行排序。

如果我们想要查找当前目录下最大的文件,或者最小的文件,那就需要对文件大小进行排序了。

那如何按文件大小进行排序呢?ls 命令的 -S 选项可以做到这一点(注意 S 是大写的)。然后将其与 -h -l 选项一起使用,会让输出看起来更舒服:

    ls -lhS

    为什么这么说呢,下面我们通过例子来看一下。


    根据大小对文件进行排序

    Linux 中有一个 sort 命令,但是它是对文件中的内容进行排序,并不是针对文件本身。

    为了对比,我们按默认的排序,列出当前目录下的文件:

      [gliu@fedora ~]$ ls -l
      total 404
      -rw-rw-r-- 1 gliu gliu 41145 May 27 15:24 ads.txt
      -rw-rw-r-- 1 gliu gliu 45443 May 24 09:03 apt-get.pdf
      -rw-rw-r-- 1 gliu gliu 29983 May 27 16:07 bash.pdf
      -rw-rw-r-- 1 gliu gliu 249773 May 26 14:56 cronjob-cheatsheet.png
      -rw-rw-r-- 1 gliu gliu 4943 Jun 2 20:09 gnome-console-voiceover
      drwxrwxr-x 4 gliu gliu 4096 Jun 2 22:09 letters
      -rw-rw-r-- 1 gliu gliu 12721 May 29 12:29 members.2022-05-29.csv
      -rw-rw-r-- 1 gliu gliu 143 May 30 12:06 routes.yaml
      drwxrwxr-x 2 gliu gliu 4096 Jun 2 22:09 words


      然后使用 -S 选项来将文件按大小进行排序(注意 S 是大写):

        [gliu@fedora ~]$ ls -lS
        total 404
        -rw-rw-r-- 1 gliu gliu 249773 May 26 14:56 cronjob-cheatsheet.png
        -rw-rw-r-- 1 gliu gliu 45443 May 24 09:03 apt-get.pdf
        -rw-rw-r-- 1 gliu gliu 41145 May 27 15:24 ads.txt
        -rw-rw-r-- 1 gliu gliu 29983 May 27 16:07 bash.pdf
        -rw-rw-r-- 1 gliu gliu 12721 May 29 12:29 members.2022-05-29.csv
        -rw-rw-r-- 1 gliu gliu 4943 Jun 2 20:09 gnome-console-voiceover
        drwxrwxr-x 4 gliu gliu 4096 Jun 2 22:09 letters
        drwxrwxr-x 2 gliu gliu 4096 Jun 2 22:09 words
        -rw-rw-r-- 1 gliu gliu 143 May 30 12:06 routes.yaml


        这样,文件就是按照大小进行的排序。但是大家可以看到,列表中输出的文件大小,单位是B,所以我们还可以使用 -h 选项,让文件大小以 KB, Mb, 或者 GB 为单位,这样更易读:

          [gliu@fedora ~]$ ls -lhS
          total 404K
          -rw-rw-r-- 1 gliu gliu 244K May 26 14:56 cronjob-cheatsheet.png
          -rw-rw-r-- 1 gliu gliu 45K May 24 09:03 apt-get.pdf
          -rw-rw-r-- 1 gliu gliu 41K May 27 15:24 ads.txt
          -rw-rw-r-- 1 gliu gliu 30K May 27 16:07 bash.pdf
          -rw-rw-r-- 1 gliu gliu 13K May 29 12:29 members.2022-05-29.csv
          -rw-rw-r-- 1 gliu gliu 4.9K Jun 2 20:09 gnome-console-voiceover
          drwxrwxr-x 4 gliu gliu 4.0K Jun 2 22:09 letters
          drwxrwxr-x 2 gliu gliu 4.0K Jun 2 22:09 words
          -rw-rw-r-- 1 gliu gliu 143 May 30 12:06 routes.yaml

          注:如果两个文件大小相同,那么它们就会按照字母顺序排序。


          按文件大小倒叙排序

          默认情况下,按文件大小排序是正向排序,也就是文件越大的会排列在顶部。我们可以选择倒序排列,结合使用 -r 选项:

            ls -lhSr

            当目录中的文件数量比较多的时候(比如日志文件,可能有数十甚至上百个),倒序排列会很有用,这样你就可以在当前屏幕中看到最大的文件,而不需要向前滚动:

              [gliu@itsfoss:~/toto$ ls -lhSr
              total 404K
              -rw-rw-r-- 1 gliu gliu 143 May 30 12:06 routes.yaml
              drwxrwxr-x 2 gliu gliu 4.0K Jun 2 22:09 words
              drwxrwxr-x 4 gliu gliu 4.0K Jun 2 22:09 letters
              -rw-rw-r-- 1 gliu gliu 4.9K Jun 2 20:09 gnome-console-voiceover
              -rw-rw-r-- 1 gliu gliu 13K May 29 12:29 members.2022-05-29.csv
              -rw-rw-r-- 1 gliu gliu 30K May 27 16:07 bash.pdf
              -rw-rw-r-- 1 gliu gliu 41K May 27 15:24 ads.txt
              -rw-rw-r-- 1 gliu gliu 45K May 24 09:03 apt-get.pdf
              -rw-rw-r-- 1 gliu gliu 244K May 26 14:56 cronjob-cheatsheet.png

              注:上述命令仅适用于文件,而不适用于目录。因为使用 ls 命令,目录的大小始终为 4kb(块大小)。目录的实际大小是通过 du (disk usage)  命令来查询的。


              获取目录中最大的前10个文件

              Linux 命令行最棒的地方在于,你可以组合多个命令从而获得不同的结果。

              比如我们要查询当前目录中一些最大的文件。那么可以按大小对文件进行排序,然后在利用管道(|)结合使用 head 命令:

                ls -lhS | head -11

                在这个例子中,我在head 后使用的参数是 11, 因为第一行显示的是一个总数:

                  [gliu@itsfoss:~/tutu$ ls -lhS | head -11
                  total 216K
                  -rwxr-xr-x 1 gliu gliu 74K Jun 2 22:09 cpufetch
                  -rw-rw-r-- 1 gliu gliu 45K Jun 2 22:38 apt-get.pdf
                  -rw-rw-r-- 1 gliu gliu 41K Jun 2 22:38 ads.txt
                  -rwxr-xr-x 1 gliu gliu 4.9K Jun 2 22:09 README.md
                  -rw-rw-r-- 1 gliu gliu 4.9K Jun 2 22:38 gnome-console-voiceover
                  drwxr-xr-x 2 gliu gliu 4.0K Jun 2 22:09 doc
                  drwxr-xr-x 2 gliu gliu 4.0K Jun 2 22:09 pictures
                  drwxr-xr-x 5 gliu gliu 4.0K Jun 2 22:09 src
                  -rwxr-xr-x 1 gliu gliu 2.8K Jun 2 22:09 CONTRIBUTING.md
                  -rwxr-xr-x 1 gliu gliu 2.4K Jun 2 22:09 cpufetch.1


                  此外,你可以使用 tail 命令用于反向排序,但我觉着没必要。

                  以上命令是展示的当前目录中的文件列表。如果要在整个计算机中查询,那么可以加上根路径 ,不过这需要root权限。但是 ls 命令不适用于此类情况,如果要查询整个计算机中的文件,可以使用 find 命令查找大于指定大小的文件。


                  连同隐藏文件一起查询排序

                  如果你在文件或目录前面加一个点 . ,那么这个文件就变成了隐藏文件,使用 ls 命令(不带任何参数)是查看不到这些隐藏文件的。

                  许多配置文件一般是隐藏的,所以在按大小排序文件时,还应考虑这些隐藏文件。

                  选项 -a 可以显示隐藏文件,包括 . .. 目录:


                    [gliu@fedora ~]$ ls -lahS
                    total 428K
                    -rw-rw-r-- 1 gliu gliu 244K May 26 14:56 cronjob-cheatsheet.png
                    -rw-rw-r-- 1 gliu gliu 45K May 24 09:03 apt-get.pdf
                    -rw-rw-r-- 1 gliu gliu 41K May 27 15:24 ads.txt
                    -rw-rw-r-- 1 gliu gliu 30K May 27 16:07 bash.pdf
                    -rw-rw-r-- 1 gliu gliu 13K Jun 3 09:41 .member.csv
                    -rw-rw-r-- 1 gliu gliu 13K May 29 12:29 members.2022-05-29.csv
                    -rw-rw-r-- 1 gliu gliu 4.9K Jun 2 20:09 gnome-console-voiceover
                    drwxrwxr-x 4 gliu gliu 4.0K Jun 3 09:41 .
                    drwxr-x--- 26 gliu gliu 4.0K Jun 3 10:19 ..
                    drwxrwxr-x 3 gliu gliu 4.0K Jun 3 10:10 letters
                    drwxrwxr-x 2 gliu gliu 4.0K Jun 2 22:09 words
                    -rw-rw-r-- 1 gliu gliu 143 May 30 12:06 routes.yaml


                    可以看到隐藏文件 .member.csv 也被输出在了列表中。


                    按大小递归排序文件

                    上述例子只是处理的当前目录中的文件。那么怎样才能包括子目录中的文件呢?如果我们要查找当前路径下最大的文件,还需要将子目录中的文件一块查找。

                    可以使用 -R 选项列出子目录中的文件。

                      ls -lRS

                      然而,这不是正确的方法,因为它不会将所有文件排序在一起,而是将它们排序在各自的目录中。

                      有一种方法,是可以使用du命令并将其组合起来,根据文件大小递归排序:

                        du -ah | sort -hr


                        许多Linux用户错误地使用-s小写s)选项按大小排序文件,这是错误的。小写 s 显示每个条目的块大小。要排序,请使用-S大写S)。


                        以上就是本次分享全部内容,欢迎讨论

                        文章转载自TIAP,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论