计算树中每个目录的条目数

计算树中每个目录的条目数

假设我有以下树:

root:
d foo 
d bar

/foo:
d A
- tmp.txt

/bar:
d B
- tmp2.txt

/foo/A:
- tmp3.txt

/bar/B:

d = 目录,- = 文件

我需要回答以下问题:哪个目录(不包括根目录)包含的条目最少?

我努力了

  find . | grep -oE '/([a-zA-Z]+/)+'

获取每个目录出现的次数。问题是此命令排除空目录,在本例中 /bar/B 被排除。

任何有关如何解决此问题的指导将不胜感激。

答案1

使用 GNU 工具:

find . -printf '%h\0' -type d ! -name . -print0 |
  sort -z |
  uniq -zc |
  sort -zn |
  sed -z q |
  tr '\0' '\n'

如果可以保证文件名不包含换行符,则可以将其简化为:

find . -printf '%h\n' -type d ! -name . -print | sort | uniq -c | sort -n | head -n1

(报告的数量是目录中的文件数量减1(.已计算,但未计算..))。

zsh

count() {
  set -- $REPLY/*(NDoN)
  REPLY=$#
}
print -r -- **/*(Do+count[1])

答案2

你可以使用这样的东西:

find . -type d -exec sh -c \
    'printf -- "%-20s: " {};
    find {} -maxdepth 1 -type f -printf "%i\n" | wc -l' \;

如果你有这棵树,(tree顺便说一句,这是一个很好的命令。):

$ tree -a .
.
├── bar
│   ├── B
│   └── tmp2.txt
├── ff
├── .ff.swp
└── foo
    ├── A
    │   └── tmp3.txt
    ├── f2.txt
    ├── f3.txt
    └── tmp.txt

你得到这个:

.                   : 2
./foo               : 3
./foo/A             : 1
./bar               : 1
./bar/B             : 0

列表较小的之一(更多的人可能有例如空文件),可以做类似的事情:

find . -type d -exec sh -c \
    'find "{}" -maxdepth 1 -type f -printf "%i\n" | \
    wc -l | xargs printf "%-2d";
    printf ": %s\n" "{}" ' \; | sort -k1,1 | head -n 1

如果文件夹不包含换行符。


如果-maxdepth不可用,替代方案可能是:

find . -type d -exec sh -c \
    'printf -- "%-20s: " "{}";
    find "{}" ! -wholename "{}" -prune -type f -printf "%i\n" | wc -l' \;

相关内容