用于递归查找具有特定扩展名的文件数的脚本



我们有一个高度嵌套的目录结构,我们有一个目录,我们称之为"my Dir",在我们的层次结构中出现了很多次。 我有兴趣计算名为"my Dir"的所有目录中的"*.csv"文件的数量(是的,名称中有一个空格)。 我该怎么做?

我尝试了这样的事情,但它不起作用:
find . -type d -name "my Dir" -exec ls "{}/*.csv" ; | wc -l

如果您想在"my Dir"下匹配模式"*.csv"的文件数量,那么:

  • 不要要求-type d;要求-type f
  • 如果你真的想要-name '*.csv',就不要要求-name "my Dir"
  • 不要尝试ls *.csv每个匹配项,因为如果目录中有更多的 N 个 csv 文件,您可能会对每个文件进行 N 次计数 N 次
  • 还要注意在-exec代码中嵌入{}

对于find的文件计数,我喜欢使用我在U&L上从Stéphane Chazelas那里学到的技巧;例如,来自: 在Linux中计算文件:

find "my Dir" -type f -name '*.csv' -printf . | wc -c

这需要GNUfind-printf因为它是POSIX标准的GNU扩展。

它的工作原理是在"my Dir"(从当前工作目录中)查找与模式匹配的文件;对于每个匹配的文件,它打印一个点(句点);这一切都通过管道传送给wc谁计算find产生的字符数(句点)——匹配文件的数量。

您将排除所有不是 My Dir 的路径:

find . -type f -not '(' -not -path '*/my Dir/*' -prune ')' -name '*.csv'

另一种解决方案是使用-path谓词来选择文件。

find . -path '*/my Dir/*.csv'

计算出现次数可能是管道到wc -l的简单问题,尽管如果某些文件的名称中包含换行符,这显然会产生错误的结果。(这有点病态,但绝对是您希望在生产代码中涵盖的内容。 一种常见的安排是只为每个找到的文件打印一个换行符,而不是它的名称。

find . -path '*/my Dir/*.csv' -printf '.n' | wc -l

(-printf谓词不在 POSIX 中,但用-exec或类似词替换并不难。

最新更新