确定 Linux 中文件和子目录的数量

确定 Linux 中文件和子目录的数量

当使用 ls -ld 在 Linux 中显示目录时,我得到如下信息:

user@shell:~/somedirectory$ ls -ld 
drwxr-xr-x 2014 K-rock users 65536 20011-11-05 11:34
user@shell:~/somedirectory$

如何使用somedirectory上面的结果找到子目录和文件的数量?据我了解,链接的数量对应于子目录的数量,但是文件的数量呢?我如何读取结果来ls -ld找到这些数字?

另外,这是一项作业,我必须使用上面显示的结果说出某个目录中的文件和子目录的数量。所以不幸的是我不能真正使用任何其他代码。

答案1

由于您想从获得的输出中进行解密,我们将尝试简化事情。

ls -ld
drwxr-xr-x 4 root root 4096 Nov 11 14:29 .

现在,ls -ld在目录上给出了上面的输出。现在,数字 4 是你需要集中精力的事情。 4对应于:

  • 该目录在其父目录中的条目;
  • 目录自己的条目.
  • ..目录内 2 个子目录中的条目。

为了验证这一点,如果我发出以下ls命令,我可以看到我还有更多目录。因此,这让我们知道我们可以从您的案例输出中解读什么。

drwxr-xr-x 2014 K-rock users 65536 20011-11-05 11:34

里面有 2012 个子目录,这就是为什么你在输出中得到 2014。

至于文件的数量,不可能从您的输出中找到它。

为了测试我的理论是否正确,我做了以下测试。

ls -la | grep -E '[d]' #Display only directories
drwxr-xr-x 12 root root 4096 Nov 11 14:42 .
drwxr-xr-x  4 root root 4096 Nov 11 14:20 ..
drwxr-xr-x  3 root root 4096 Nov 11 14:45 hello1
drwxr-xr-x  2 root root 4096 Nov 11 14:42 hello2
drwxr-xr-x  2 root root 4096 Nov 11 14:42 hello3
drwxr-xr-x  2 root root 4096 Nov 11 14:42 hello4
drwxr-xr-x  2 root root 4096 Nov 11 14:42 hello5
drwxr-xr-x  2 root root 4096 Nov 11 14:42 hello6
drwxr-xr-x  2 root root 4096 Nov 11 14:42 hello7
drwxr-xr-x  2 root root 4096 Nov 11 14:42 hello8
drwxr-xr-x  2 root root 4096 Nov 11 14:21 hello-subdir
drwxr-xr-x  2 root root 4096 Nov 11 14:29 spaced hello

现在,我发出ls -ld命令,得到的输出是,

ls -ld
drwxr-xr-x 12 root root 4096 Nov 11 14:42 .

它没有考虑文件夹子目录中嵌套的文件或子目录。基本上,上面的命令表示我的文件夹中有 10 个目录。

PS:从输出中解析某些内容通常是一个坏主意,ls因为它不可靠。如果你有机会使用它,请使用findwith代替。-maxdepth

答案2

如果您可以使用ls,那么我假设您bash也可以使用内置功能。

使用 purebash来统计当前目录中的所有条目:

$ num_entries () (       # Define a function to:
> shopt -s nullglob      # expand * to empty string if no files
> shopt -s dotglob       # include .files in * expansion
> a=( * )                # create array containing all entries in current directory
> echo ${#a[@]}          # display length of array (number of directory entries)
> )
$ num_entries            # call function for current directory
467
$ 

使用 purebash来统计当前目录下的所有子目录:

$ num_dirs () (
> shopt -s nullglob
> shopt -s dotglob
> a=( */ )               # note the */ glob which selects only directories
> echo ${#a[@]}
> )

我将它们放在( )函数体内,这样shopt设置只会在该函数内有效,并且没有其他副作用。

答案3

在一个简单的情况下,这是有效的:

ls -A1 | wc -l

答案4

您可以结合几种方法

  1. 目录中的文件数

    ls -l | grep "^-" | wc -l
    
  2. 遍历子目录

    find ./subdirectory -type d
    
  3. 放在一个命令中

     find ./subdirectory -type d | xargs -I{} sh -c "ls -l {} | grep -c '^-'"
    

将递归地计算目录中保留的文件数量。

当然,有多种方法可以美化或丰富输出。

相关内容