我在目录:
/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
您可以通过设置dotglob
shell 选项来包含隐藏项目。