计算目录数量

计算目录数量

我需要一个脚本或命令来打印整个目录子树中名称以“lib”开头的多个目录。我试图使用 find、grep 和 wc 来执行此操作,但无法扫描所有目录。怎么做?

答案1

find . -type d -name lib\* -exec echo x \; | wc -l

答案2

LC_ALL=C find .//. -name 'lib*' -type d | grep -c //

您不能使用,find . | wc -l因为如果存在带有换行符的文件路径,它将无法正常工作。

否则LC_ALL=C,可能无法计算以libbut 开头的目录名称,其中名称的其余部分包含不形成有效字符的字节。

zsh

(){echo $#} **/lib*(DN/)

答案3

假设所有lib目录都有正常的名称,没有换行符或其他奇怪/异国情调的字符:

find / -type d -name "lib*" -print | wc -l

这假设您通过“整个目录子树”表示“任何地方”。改为只/.当前目录或以下目录。

find命令将查找名称以 ( ) 开头的所有目录( -type d)并打印这些目录 ( )。lib-name "lib*"-print

将会wc -l计算 的输出中的行数find

答案4

这是一个仅使用 bash 的解决方案,使用globstarshell 选项:

$ shopt -s globstar; c=0; for f in ** ; do echo "${f##*/}"; [[ "${f##*/}" =~ ^lib* ]] && [[ -d "$f" ]]  && ((c++)); done ; echo $c

或者采用脚本格式以提高可读性:

#!/usr/bin/env bash
shopt -s globstar 
c=0
for f in **
do 
    echo "${f##*/}"
    if [[ "${f##*/}" =~ ^lib* ]] && [[ -d "$f" ]]
    then 
        ((c++))
    done
echo $c

globstar允许我们启用递归通配符,并通过[[模式匹配和-d标志来检查这是否是一个目录,我们增加计数器变量$c,最后打印该变量。

相关内容