Bash 如何只计算位于层次结构中较深的特定子目录中的文件数?

Bash 如何只计算位于层次结构中较深的特定子目录中的文件数?,bash,count,find,Bash,Count,Find,我需要计算位于TMP目录(Debian机器)中的所有会话文件sess.*,并知道每个TMP的路径以及每个TMP的计数 所有父目录都位于/somepath/to/clientsDirs中 一个客户端的目录结构是 ../ClientDirX/webDirYX/someDirZx ../ClientDirX/webDirYX/someDirZy ../ClientDirX/webDirYX/tmp ../ClientDirX/webDirYX/someDirZz ../ClientDirX/webDi

我需要计算位于TMP目录(Debian机器)中的所有会话文件
sess.*
,并知道每个TMP的路径以及每个TMP的计数

所有父目录都位于
/somepath/to/clientsDirs

一个客户端的目录结构是

../ClientDirX/webDirYX/someDirZx
../ClientDirX/webDirYX/someDirZy
../ClientDirX/webDirYX/tmp
../ClientDirX/webDirYX/someDirZz
../ClientDirX/webDirYX/...
../ClientDirX/webDirYX/someDirZN

../ClientDirX/webDirYY/someDirZx
../ClientDirX/webDirYY/someDirZy
../ClientDirX/webDirYY/tmp
../ClientDirX/webDirYY/someDirZz
../ClientDirX/webDirYY/...
../ClientDirX/webDirYY/someDirZN
所有
someDirZ
tmp
目录都有不同数量的子目录会话文件仅在tmp目录中,不在tmp子目录中。在一个
tmp
dir中可能有数百万个
sess.*
文件,因此解决方案需要非常高效的时间

十、 目录名中的YY等始终是数字,但不是连续行,例如:

ClientDir1/webDir3/*
ClientDir4/webDir31/*
ClientDir4/webDir35/* 
ClientDir18/webDir2/*

请您通过命令行或bash脚本帮助我统计每个
tmp
dir
中的所有
sess.*
文件,好吗?

编辑:更改问题含义后更改答案

整个任务分为三个部分。 我把目录名改为simpler

1.构建要搜索的tmp目录列表(第一个脚本)

解释

-type d only search for directories
-maxdpth 1 specifies the maximum search depth
-name specifies the name of the items sought
>list redirects the result to the list file
* it is so-called shell globbing in this case means 
  any string of characters
我们在一个单独的文件中执行此任务有两个原因。首先,执行时间将非常重要。第二,客户名单并不经常变化,每次检查都没有意义

2.bash中列表项的迭代循环(参见最终脚本)

3.在tmp目录中搜索sess_*文件,不包括子目录

find /path/to/tmp -maxdepth 1 -type f -name "sess_*" -exec printf "1" \; |wc -c
解释

-type f only searches files
-exec executes any system command in this case, printf
 \; necessary part ending the -exec command, must contain a space!
-之所以使用exec printf,是因为并非find的每个版本都内置printf命令,所以这也适用于busybox或GNU以外的环境 如果您的查找具有printf,请使用它而不是-exec(-printf“1”)

有关更多信息,请参见命令
man find

最后,第二个脚本:

#!/bin/bash
for x in `cat list`
do
  printf "%s \t" $x
  find $x -maxdepth 1 -type f -name "sess_*" -exec printf "1" \; | wc -c
done
示例结果:

/var/log/clients/sd1/wd1/tmp    3
/var/log/clients/sd2/wd1/tmp    62
编辑:
注意,在某些版本中,当-maxdepth 1命令更改-type f程序抛出工作或不工作时,会找到GNU(例如4.7.0-git)。出于某种原因,这些版本似乎不使用getopt机制。其他版本的find似乎没有这个问题。

解决方案需要非常高效。好的,但是你试过什么?我不擅长Linux命令,所以我有两个问题无法解决->如何仅为TMP dir添加计数条件以及如何创建一个循环来遍历目录树。根据我在论坛上读到的许多帖子,我无法理解。我尝试了你的解决方案。。。但我意识到我被误解了,因为我没有明确声明我不需要知道整个目录树中的所有sess_uu文件,但我需要分别知道每个TMP目录的所有sess_u文件(包括识别该TMP地址簿)。对于规范中的错误,我深表歉意,我已经添加了此信息。当我将您的第一个命令
find/somepath/to/clientsDirs*-type f-name“sess_*”| wc-l
放入命令行-->时,我得到了一个TMP目录的编号,这很好。。。。但是,当我将相同的命令(仅使用modification-exec代替|)放入bin/bash脚本时,我收到了错误消息
/somepath/to/clientsDirs:Is a directory
。。。我需要修改什么才能得到数字而不是错误?@Radek描述有点模糊。您希望分别计算每个tmp目录的sess_*文件数。有些目录等你一点也不感兴趣?我做对了吗?至于在bash脚本中嵌入,如果不了解您的具体操作,很难参考它。@Radek-type和-maxdepth选项的顺序并不重要。感谢您,但我们同意批准正确的解决方案。
/var/log/clients/sd1/wd1/tmp    3
/var/log/clients/sd2/wd1/tmp    62