我们有一个高度嵌套的目录结构,我们有一个目录,我们称之为"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
或类似词替换并不难。