bash - grep 没有那个文件或目录

标签 bash

我正在学习 bash 的基础知识,但遇到了麻烦。当我尝试列出来自 dev 的以一位或两位数字结尾的文件时,我永久得到“没有这样的文件或目录”。

ls /dev | grep ^.*[0-9]{1,2}$
ls /dev | grep -E ^.*[0-9]{1,2}$
ls /dev | egrep ^.*[0-9]{1,2}$
ls /dev | grep ^.*\[0-9\]\{1,2\}$

所有这些命令都以相同的响应结束。我做错了什么?

最佳答案

试试这个:

find /dev -maxdepth 1 -regex '.*[0-9]'

我们在这里使用find,因为一般来说,永远不要 parse the output of ls .

find/dev -maxdepth 1 找到 /dev 中的所有文件(但我们阻止它搜索 /dev 的子目录) .

-regex '.*[0-9]'find 的输出限制为名称(不包括任何目录)与正则表达式 匹配的文件.*[0-9]。不需要锚定正则表达式以匹配文件名的从头到尾:这是查找的默认行为。

默认情况下,find 使用 emacs 风格的正则表达式。 GNU find 可以选择使用 -regextype,使用其他四种正则表达式样式之一:posix-awk、posix-basic、posix-egrep 和 posix-extended。有关详细信息,请参见 man find

请注意,因为 . 匹配其他字符中的数字,所以正则表达式 .*[0-9]{1,2} 匹配 1 个或任意数量的更多数字在最后。这使得它等同于 .*[0-9]

简化:

正如本杰明在评论中提到的,这非常简单,不需要 regex。使用 glob 代替:

find /dev -maxdepth 1 -name '*[0-9]'

拒绝名称以三位或更多数字结尾的文件

这将找到其名称至少有一个非数字字符并以一或两个但不能更多的数字结尾的文件:

find /dev -maxdepth 1 -regextype posix-egrep -regex '.*[^[:digit:]][[:digit:]]{1,2}'

如果您只想在屏幕上显示文件名但不想将它们作为管道的一部分进行解析,那么以下内容可能就足够了。这将找到名称至少包含三个字符并以一或两位但不多于数字结尾的文件:

ls /dev/*[^[:digit:]]?[[:digit:]]

这个 ls 解决方案确实有一个障碍:它会拒绝像 a1b2 这样的文件名,即使它以一位数字结尾。由于 /dev 通常没有那种命名风格,这可能不是什么大问题。

在上述两种方法中,我使用了 [:digit:] 因为它是 unicode 安全的。如果您所在的语言环境无关紧要,您可以使用 0-9 代替,如果您愿意的话:

find /dev -maxdepth 1 -regextype posix-egrep -regex '.*[^0-9][0-9]{1,2}'

或者:

ls /dev/*[^0-9]?[0-9]

关于bash - grep 没有那个文件或目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37232647/

相关文章:

linux - 在 ubuntu 中自定义 ssh 命令

linux - 为什么 `ls -al & ; ls -al`无效?

bash - 在docker创建时运行bash客户端以设置环境变量

regex - "sed"特殊字符处理

bash - 一个 awk 命令中的 `and` 和 `or` 的多个条件

string - 如何从 Bash 中的路径字符串中删除文件后缀和路径部分?

android - 为什么 gradle 不运行我的 shell 脚本?

ruby - 如何将 Ruby 脚本变成 bash 命令?

bash - 带变量的括号扩展?

linux - 编写运行其他用户拥有的另一个 shell 脚本的 shell 脚本