如何计算名称中包含元音的文件数

How to count the number of files whose name contains a vowel

我试图编写一个脚本来计算目录中带有元音字母的文件的数量。

如果我使用

find  -type f | wc -l

我得到目录 $1 中的文件数,但我不知道如何使用 grep 来计算带有元音的文件,我正在尝试这样的事情

find  -type f | grep -l '[a,e,i,o,u,A,E,I,O,U]' | wc -l

你可以使用这个 gnu find 命令来计算所有至少有一个元音的文件:

find . -maxdepth 1 -type f -iname '*[aeiou]*' -printf ".\n" | wc -l

-iname '*[aeiou]*' glob 模式将只匹配至少具有 a,e,i,o,u(忽略大小写)之一的文件名。

如果您还想在子目录中对文件进行递归计数,请删除 -maxdepth 1

如果您可以接受计数目录:

ls -d *a* *e* *i* *o* *u* *y* *A* *E* *I* *O* *U* *Y* | wc -l

否则:

find  -type f | grep -i '[aeiouy]' | wc -l

您的尝试失败有两个原因。首先,如果 grep 在管道中读取,-l 没有意义,因为 -l 的目的是只打印匹配的输入文件,但在这种情况下,唯一的输入文件是标准输入。其次,你的语法错误。尝试:

... | grep -i '[aeiou]' | ...

请不要在字符组表达式中使用逗号([]括号中的东西)

最好的方法是先执行 find(1) 以获取要扫描的文件。然后您需要基本名称,因为路径信息无效。最后需要用[aeiouAEIOU] grep 只得到有元音的行,最后用wc(1) 统计行数。

find ${DIRECTORY} -type f -print | sed -e 's@^.*/@@' | grep '[aeiouAEIOU]' | wc -l

-type f 允许您 select 仅文件(而非目录)。 sed(1) 命令逐行编辑输出,删除名称的第一部分直到最后一个 / 字符。 grep 过滤名称至少包含一个元音字母并丢弃其他字母,最后 wc -l 计算行数。