【问题标题】:How to count the number of files whose name contains a vowel如何计算名称中包含元音的文件数
【发布时间】:2015-09-13 16:44:49
【问题描述】:

我正在尝试编写一个脚本来计算目录中带有元音的文件数。

如果我使用

find $1 -type f | wc -l

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

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

【问题讨论】:

  • 您的问题是关于单个目录,但您的 find 命令将遍历其所有子目录。如果这不是您的意图,可以添加 -maxdepth 1

标签: linux bash shell unix scripting


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    否则:

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

    【讨论】:

    • 也称为ls -d *[aeiouAEIOU]*(我省略了不在规范中的y)。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      最好的方法是先做一个find(1) 来获取你想要扫描的文件。然后您需要基本名称,因为路径信息无效。最后,您需要使用[aeiouAEIOU] grep 以仅获取带有元音的行,最后使用wc(1) 来计算行数。

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

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

      【讨论】:

      • sed | grep 是一个antipatterngrep | wc -l 也是一种反模式。
      • 我一直在阅读该链接,并且对该页面有自己的 cmets。不要盲目地遵循那里的建议,因为并非所有greps 都支持-c 选项,因为并非所有greps 都支持编辑。 unix 的古老哲学是制作只做小事的程序,但要把它们做好。 如果您关注该页面,那么为什么不使用perl(1)?也感谢您的反对。
      猜你喜欢
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      相关资源
      最近更新 更多