是否有任何命令或命令组可以递归计算以某个特定字母开头的所有子目录的数量?
答案1
您可以结合使用find
和wc
命令
例如,计算从当前目录开始.
并以字母“s”开头的目录
find . -type d -name 's*' -printf "1" | wc -c
该-name
条件使用 shell 模式匹配规则与目录名称进行匹配(也可以使用正则表达式语法,但在这里这样做就有点过了)。每次找到匹配项时,该-printf "1"
部分都会打印该字符,并对这些字符进行计数。1
wc -c
1
打印和计数的字符的选择是任意的。
显示和数一数,你可以做
find . -type d -name 's*' | tee >(wc -l)
但请注意,如果任何目录名称包含换行符(罕见但合法),则计数可能不准确。
答案2
使用python单行命令:
$ tree top
top
├── sub1
│ └── another_subdir
├── sub2
└── sub3
4 directories, 0 files
$ python -c 'import os,sys;print(sum([ 1 for r,s,f in os.walk(sys.argv[1]) for i in s if i.startswith("s") ]))' ./top
3
单行代码的工作原理如下:
- 我们将把想要遍历的目录作为命令行参数传递,为此我们需要
sys
模块,而对于目录遍历我们需要os.walk()
函数 - 因此我们需要“os 模块”。 print()
将打印输出,sum()
其内容是我们通过列表推导 (形式) 创建的列表内的所有项目的总和[i for i in iterable]
。- 列表推导式可以视为两个嵌套的 for 循环。每次迭代
os.walk()
都会给出顶级目录、其子目录列表和其文件列表。当我们迭代子目录列表时,我们将通过方法s
检查每个子目录是否以字母 开头,如果是,则将 1 添加到列表中。因此基本上会将一长串 1 加在一起。s
.startswith()
sum()
答案3
find . -type d -not -path '.' -printf 0 | wc -c ;
递归查找当前目录 (find .) 中所有不是 (.) 目录的目录 (-type d),并为找到的每个目录打印 0。然后wc -c
从上一个命令输出中计算字符数 (0)。