Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash grep没有这样的文件或目录_Bash - Fatal编程技术网

Bash grep没有这样的文件或目录

Bash grep没有这样的文件或目录,bash,Bash,我正在学习bash的基础知识,我遇到了麻烦。当我试图列出dev中以一个或两个数字结尾的文件时,我永久性地得到“没有这样的文件或目录” 所有这些命令都以相同的响应结束。我做错了什么?在每个命令中将less替换为ls 更新: 我看到您用ls更新了您的问题,但尚未完成更新以包含正确的shell报价。查看其他响应以获取示例。您要查找的命令是: ls /dev | grep -E '^.*[0-9]{1,2}$' 使用ls,而不是less,列出目录 正则表达式范围与bash大括号扩展冲突,因此需要引用

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


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

在每个命令中将
less
替换为
ls

更新:


我看到您用
ls
更新了您的问题,但尚未完成更新以包含正确的shell报价。查看其他响应以获取示例。

您要查找的命令是:

ls /dev | grep -E '^.*[0-9]{1,2}$'
  • 使用
    ls
    ,而不是
    less
    ,列出目录
  • 正则表达式范围与bash大括号扩展冲突,因此需要引用以防止bash解释它(这就是为什么会出现“未找到文件”错误)
  • 正则表达式范围(
    {1,2}
    )是POSIX ERE的一个特性,需要
    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样式的正则表达式。GNU
find
可以选择使用
-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}$'