列出名称中包含两个连续元音的目录。 Linux终端命令

时间:2011-05-26 04:59:37

标签: regex linux grep ls

问题是: 编写一个命令来打印/ home中包含两个连续元音(小写)的目录数。

我试过了:

ls /home/*[aeiou][aeiou]*
然而,这显然是为什么它不起作用。

我试过了:

ls /home | grep *[aeiou][aeiou]*

我一无所获。我知道,一旦我弄清楚如何用两个连续的元音隔离目录,我需要把它传递到wc命令。或者如果我使用grep来做它我可以使用-c。我也尝试过但这并不好。

5 个答案:

答案 0 :(得分:4)

炼制@ sverre的答案,

ls -d */ | grep '[aeiou]\{2,2\}'

您之前和之后不需要.* - 默认情况下会找到匹配项。

-d */选项将仅打印目录名称。

答案 1 :(得分:4)

您只需要:

 ls -d *[aeiou][aeiou]*/

因为尾部斜杠会将glob限制为目录。

如果您希望它不区分大小写,或者是递归的,或者包含名称以dot开头的目录,或者如果您想要包含y的元音而不是辅音,那么它就变得更加干净了,或者你需要在你的元音上考虑可能的变音符号,& c& c& c。

答案 2 :(得分:3)

grep进行正则表达式匹配,而非全局匹配。

ls -d */ | grep '[aeiou]\{2\}'

当你尝试几乎相同的事情时,你没有引用正则表达式。这就是为什么它不适合你:Shell将regexp视为文件glob,将其扩展到匹配文件列表(如果有的话),而不是将regexp传递给grep。引用正则表达式会阻止shell将其视为glob并将其扩展。

感谢@harpo了解如何过滤目录。

答案 3 :(得分:2)

您使用find将搜索限制为目录。由于find是递归的,因此必须设置遍历的文件系统对象的下限和上限。然后每个条目打印一个字符,并计算它们。

find /home -mindepth 1 -maxdepth 1 -type d -name '*[aeiou][aeiou]*' -printf '*' | wc -c

答案 4 :(得分:2)

ls /home/*[aeiou][aeiou]*将找到您想要的目录,但随后会列出评论。

ls -d /home/*[aeiou][aeiou]*将列出目录名称,而不是其内容。

ls -d /home/*[aeiou][aeiou]* | wc -l将计算匹配条目的数量。

正如其他人所指出的那样,在末尾添加/将确保您只看到目录而不是只有两个元音的普通文件。