Bash grep没有这样的文件或目录
我正在学习bash的基础知识,我遇到了麻烦。当我试图列出dev中以一个或两个数字结尾的文件时,我永久性地得到“没有这样的文件或目录”Bash grep没有这样的文件或目录,bash,Bash,我正在学习bash的基础知识,我遇到了麻烦。当我试图列出dev中以一个或两个数字结尾的文件时,我永久性地得到“没有这样的文件或目录” 所有这些命令都以相同的响应结束。我做错了什么?在每个命令中将less替换为ls 更新: 我看到您用ls更新了您的问题,但尚未完成更新以包含正确的shell报价。查看其他响应以获取示例。您要查找的命令是: ls /dev | grep -E '^.*[0-9]{1,2}$' 使用ls,而不是less,列出目录 正则表达式范围与bash大括号扩展冲突,因此需要引用
所有这些命令都以相同的响应结束。我做错了什么?在每个命令中将
less
替换为ls
更新:
我看到您用
ls
更新了您的问题,但尚未完成更新以包含正确的shell报价。查看其他响应以获取示例。您要查找的命令是:
ls /dev | grep -E '^.*[0-9]{1,2}$'
- 使用
,而不是ls
,列出目录less
- 正则表达式范围与bash大括号扩展冲突,因此需要引用以防止bash解释它(这就是为什么会出现“未找到文件”错误)
- 正则表达式范围(
)是POSIX ERE的一个特性,需要{1,2}
或egrep
-E
ls
输出做任何事情都是不受欢迎的。更好的方法是只使用常规glob(这里使用printf
输出它,而不是将它传递给其他对象):
试试这个:
find /dev -maxdepth 1 -regex '.*[0-9]'
我们在这里使用find
,因为一般来说,人们不应该这样做
find/dev-maxdepth 1
查找/dev
中的所有文件(但我们阻止它搜索/dev
的子目录)
-regex.*[0-9].
将find
的输出限制为名称(不包括任何目录)与正则表达式*[0-9]
匹配的文件。无需锚定正则表达式以从文件名的开头到结尾进行匹配:这是find的默认行为
默认情况下,find
使用emacs样式的正则表达式。GNUfind
可以选择使用-regextype
使用其他四种正则表达式样式之一:posix awk、posix basic、posix egrep和posix extended。有关详细信息,请参见man find
请注意,由于
在其他字符中匹配数字,因此regex*[0-9]{1,2}
在末尾匹配1或更多数字。这相当于*[0-9]
简化:
正如Benjamin在评论中提到的,这非常简单,不需要正则表达式。改用glob:
拒绝名称以三位或更多数字结尾的文件
这将查找其名称至少包含一个非数字字符并以一个或两个但不超过两个数字结尾的文件:
find /dev -maxdepth 1 -regextype posix-egrep -regex '.*[^[:digit:]][[:digit:]]{1,2}'
ls /dev/*[^[:digit:]]?[[:digit:]]
如果您只想在屏幕上显示文件名,而不想将其作为管道的一部分进行解析,那么下面的内容就足够了。这将查找名称至少包含三个字符并以一个或两个但不超过两个数字结尾的文件:
find /dev -maxdepth 1 -regextype posix-egrep -regex '.*[^[:digit:]][[:digit:]]{1,2}'
ls /dev/*[^[:digit:]]?[[:digit:]]
这个ls
解决方案确实有一个缺陷:它将拒绝像a1b2
这样的文件名,即使它以一个数字结尾。由于/dev
通常没有这种命名风格,这可能不是什么大问题
在上述两种方法中,我使用了[:digit://code>,因为它是unicode安全的。如果您所在的区域设置不重要,您可以使用0-9
,如果您愿意:
find /dev -maxdepth 1 -regextype posix-egrep -regex '.*[^0-9][0-9]{1,2}'
或:
您需要将模式参数置于引号中的grep
。如果没有引号,*
字符使其成为文件名通配符,并且当前目录中没有与该模式匹配的文件,因此您会收到该错误消息
ls /dev | grep '^.*[0-9]{1,2}$'
正如其他答案所指出的,列出目录中文件的命令是ls
,less
用于查看文本文件的内容。它是ls
而不是less
。后者是一个寻呼机(它列出文件)……而且ls | grep
也不是一个好的做法——有更好的方法来获得文件的过滤列表。另请参阅,以了解获取文件筛选列表的最佳实践方法(当您不需要强制基于正则表达式的筛选时)。此外,您需要引用传递给grep
的表达式,否则在到达grep
命令之前,它们很容易被shell修改。看看这里的例子是如何使用单引号来保护这些内容的。这里的观察结果是,任何以两位数结尾的名称也以一位数结尾。如果您想要1或2而不是3,则必须使用例如[^0-9][0-9]{1,2}$
您甚至不需要正则表达式,是吗?只能将globbing与-name'*[0-9]'
一起使用。@BenjaminW。说得好。谢谢答案更新了一个glob示例。@cAMPy根据您的说明,我用方法更新了我的答案,将最终数字限制在一到两位数,但不能超过一位数。
ls /dev/*[^0-9]?[0-9]
ls /dev | grep '^.*[0-9]{1,2}$'