我需要一个脚本或命令来打印整个目录子树中名称以“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
,可能无法计算以lib
but 开头的目录名称,其中名称的其余部分包含不形成有效字符的字节。
和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 的解决方案,使用globstar
shell 选项:
$ 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
,最后打印该变量。