假设我有以下树:
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' \;