如何在当前目录中获取文件夹列表以及每个文件夹中并排的文件数量?

如何在当前目录中获取文件夹列表以及每个文件夹中并排的文件数量?

我在目录: /home/john/my_test_files/ 目录下有 100 个文件夹:

folder1
folder2
folder3
...
folder100

我将使用什么命令来并排打印文件夹列表和每个文件夹的文件计数。像这样:

folder1     25
folder2     78
folder3     34
...
folder100   88

其中folder1有 25 个文件,folder2其中有 78 个文件,等等

我确信这是一些基本的问题,但我找不到好的答案......

答案1

这是一个相对较慢的解决方案,但提供了不错的输出:) 将以下函数放在文件底部~/.bashrc。然后打开新的终端窗口或执行源运行命令文件:. ~/.bashrc

count_in() {
    # set the current directory as default value
    local paths="$PWD"; echo
    # read the user's input as array when it is provided
    [[ ! -z ${@+x} ]] && local paths=( "$@" )

    # loop over the user's input
    for path in "${paths[@]}"
    do
        # test whether this is a directory
        [[ ! -d $path ]] && { echo -e "'$path' is not a directory.\n"; break; }

        # output color table header for each top level directory
        printf '\e[1;34m%-6s%-6s%-6s%s\e[m\n' "total" "files" "dirs" "analyzed directory"
        # analyse the top level data
        total=$(find "$path/" -mindepth 1 -maxdepth 1 | wc -l)
        files=$(find "$path/" -mindepth 1 -maxdepth 1 -type f | wc -l)
        dirs=$(find "$path/" -mindepth 1 -maxdepth 1 -type d | wc -l)
        # outpot the top level data
        printf '%-6d%-6d%-6d%s\n' "$total" "$files" "$dirs" "$path"

        # output color table separator for the inner directories
        printf '\e[1;96m%-6s%-6s%-6s%s\e[m\n' "total" "files" "dirs" "sub dir name"
        # for each inner directory
        while IFS='' read -r dir
        do
                # analyse a inner directory's data
                total=$(find "$dir" -mindepth 1 -maxdepth 1 | wc -l)
                files=$(find "$dir" -mindepth 1 -maxdepth 1 -type f | wc -l)
                dirs=$(find "$dir" -mindepth 1 -maxdepth 1 -type d | wc -l)
                # outpot the inner directory's data
                printf '%-6d%-6d%-6d%s\n' "$total" "$files" "$dirs" "$(basename "$dir")"
        done <<< $(find "$path/" -mindepth 1 -maxdepth 1 -type d -print)
        echo
    done
}

然后将该count_in函数用作 shell 命令:

count_in  # will analyse the current directory
count_in  /path1 /path2

示例输出:

spas@Desktop:~$ count_in Pictures ~/Videos 'Something else'

total files dirs  analyzed directory
9     3     6     Pictures
total files dirs  sub dir name
19    19    0     Life Hacks
6     6     0     GIF
55    54    1     Wallpapers
20    18    2     Avatars
173   31    142   Photos
3     2     1     Icons

total files dirs  analyzed directory
6     0     6     /home/spas/Videos
total files dirs  sub dir name
66    0     66    Movies
11    0     11    Documentary.and.Conspiracy
7     7     0     .fun
16    2     14    Science.and.SciFi
2     2     0     Fun
2     1     1     Audio.Books

'Something else' is not a directory.

在此处输入图片描述

答案2

du -s --inodes *我想到了(--inodes该选项仅在较新的 Ubuntu 版本中可用,我相信在 16.04 及更高版本中可用)。这将打印类似

4       logs
1       pom.xml
140     src
323     target

目录/文件名前面的数字是目录内的文件和目录的数量,包括目录本身。

为了说明这个数字,我们看一下logs目录。

$ find logs
logs
logs/2019-11-17-2.log.gz
logs/latest.log
logs/2019-11-17-1.log.gz
$ find logs | wc -l
4

您会看到目录包含 3 个文件,加上目录本身共有 4 个,如du输出所示。

请注意,计算find输出中的行数并不是确定文件数量的可靠方法,因为包含换行符的文件名会被计算两次。在我的简单示例中,这没有问题,但在你的情况下,这种方法可能不可靠。du无论文件名中是否有任何特殊字符,该方法都有效。

答案3

这取决于你的意思文件

如果您想要计算所有非隐藏项目(文件/目录/符号链接) - 与使用简单命令看到的相同ls- 您可以执行如下 shell 循环:

shopt -s nullglob
for d in */; do set -- "$d"/*; printf '%s\t%d\n' "$d" "$#"; done

它使用*glob 来扩展每个目录中的项目列表,再加上 shellset内置命令将结果分配给 shell 的位置参数列表 - 其计数可在特殊变量中找到$#

如果您不想在输出中出现尾部斜杠,请"$d"在打印语句中更改为"${d%/}". To pretty-print the results, pipe them through列 -t`:

shopt -s nullglob
for d in */; do set -- "$d"/*; printf '%s\t%d\n' "${d%/}" "$#"; done | column -t

您可以通过设置dotglobshell 选项来包含隐藏项目。

相关内容