AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 810563
Accepted
Zanna
Zanna
Asked: 2016-08-11 06:44:45 +0800 CST2016-08-11 06:44:45 +0800 CST 2016-08-11 06:44:45 +0800 CST

为什么 `ls -l` 计数的文件比我多?

  • 772

显然我数不过来。我认为里面有三个文件/media

$ tree /media
/media
├── foo
├── onex
└── zanna
3 directories, 0 files

但是,ls -l找到 12 个。

$ ls -l /media
total 12
drwxr-xr-x  2 root root 4096 Jul 31 20:57 foo
drwxrwxr-x  2 root root 4096 Jun 26 06:36 onex
drwxr-x---+ 2 root root 4096 Aug  7 21:17 zanna

而且,如果我这样做,除了上述之外,ls -la我只会得到,但计数是...total 20

有什么解释?

command-line
  • 2 2 个回答
  • 9349 Views

2 个回答

  • Voted
  1. Best Answer
    user4556274
    2016-08-11T06:49:36+08:002016-08-11T06:49:36+08:00

    你看到的12不是文件数,而是消耗的磁盘块数。

    来自info coreutils 'ls invocation':

     For each directory that is listed, preface the files with a line
     `total BLOCKS', where BLOCKS is the total disk allocation for all
     files in that directory.  The block size currently defaults to 1024
     bytes, but this can be overridden (*note Block size::).  The
     BLOCKS computed counts each hard link separately; this is arguably
     a deficiency.
    

    当您使用而不是因为您正在计算两个额外的目录时,总数会从12到:和. 您为每个(空)目录使用四个磁盘块,因此您的总数从 3 × 4 变为 5 × 4。(很可能,您为每个目录使用一个4096 字节的磁盘块;如页面所示,实用程序不检查磁盘格式,但除非另有说明,否则假定块大小为 。)20ls -lals -l...info1024

    如果您想简单地获取文件数,您可以尝试类似

    ls | wc -l
    
    • 38
  2. Sergiy Kolodyazhnyy
    2016-08-11T12:51:56+08:002016-08-11T12:51:56+08:00

    user4556274 已经回答了为什么。我的回答仅用于提供有关如何正确计算文件的其他信息。

    在 Unix 社区中,普遍的共识是解析 的输出ls是一个非常非常糟糕的主意,因为文件名可以包含控制字符或隐藏字符。例如,由于文件名中有换行符,我们ls | wc -l告诉我们(它确实有)的输出中有 5 行ls,但实际上目录中只有 4 个文件。

    $> touch  FILE$'\n'NAME                                                       
    $> ls                                                                         
    file1.txt  file2.txt  file3.txt  FILE?NAME
    $> ls | wc -l
    5
    

    方法#1:查找实用程序

    该find命令通常用于解析文件名,可以通过打印inode number来帮助我们。无论是目录还是文件,它都只有一个唯一的 inode 编号。因此,使用-printf "%i\n"和排除.通过-not -name "."我们可以准确计数文件。(注意使用-maxdepth 1防止递归下降到子目录)

    $> find  -maxdepth 1 -not -name "." -print                                    
    ./file2.txt
    ./file1.txt
    ./FILE?NAME
    ./file3.txt
    $> find  -maxdepth 1 -not -name "." -printf "%i\n" | wc -l                    
    4
    

    方法#2:globstar

    简单、快速且最便携的方式:

    $ set -- * 
    $ echo $#
    228
    

    set命令用于设置 shell 的位置参数($<INTEGER>变量,如 中echo $1)。这通常用于解决/bin/sh缺少数组的限制。可以在Gille在 Unix&Linux 上的回答中找到执行额外检查的版本。

    在支持数组的 shell 中,例如bash,我们可以使用

    items=( dir/* )
    echo ${#items[@]}
    

    正如Steeldriver 在评论中提出的那样。

    与使用和 globstar的find方法类似的技巧可用于计算每行的 inode 数量:wcstat

    $> LC_ALL=C stat ./* --printf "%i\n" | wc -l                                          
    4
    

    另一种方法是在for循环中使用通配符。(注意,此测试使用不同的目录来测试此方法是否下降到子目录,它没有 - 16 是经过验证的 my 中的项目数~/bin)

    $> count=0; for item in ~/bin/* ; do count=$(($count+1)) ; echo $count ; done | tail -n 1                                
    16
    

    方法#3:其他语言/口译员

    Python 还可以通过打印给定我的os.listdir()函数的列表长度来处理有问题的文件名(这是非递归的,并且只会列出作为参数给出的目录中的项目)。

    $> python -c "import os ; print os.listdir('.')"                              
    ['file2.txt', 'file1.txt', 'FILE\nNAME', 'file3.txt']
    $>  python -c "import os ; print(len(os.listdir('.')))"                    
    4
    

    也可以看看

    • 计算目录中有多少文件的最资源有效的方法是什么?
    • 18

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve