当使用 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
因为它不可靠。如果你有机会使用它,请使用find
with代替。-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
您可以结合几种方法
目录中的文件数
ls -l | grep "^-" | wc -l
遍历子目录
find ./subdirectory -type d
放在一个命令中
find ./subdirectory -type d | xargs -I{} sh -c "ls -l {} | grep -c '^-'"
将递归地计算目录中保留的文件数量。
当然,有多种方法可以美化或丰富输出。