我只需要使用 ls 查找具有扩展名的目录中的文件(不能使用 find)。
我试过 ls *.*,但如果 dir 不包含任何带扩展名的文件,它会返回“没有这样的文件或目录”。
如果有扩展名的文件,我不希望出现该错误并希望 ls 返回到 cmd 提示符。
我试图将 grep 与 ls 一起使用来实现相同的目的。
ls|grep "*.*" - 不起作用,但 ls | grep "\." 作品。
我不知道为什么 grep *.* 不起作用。任何帮助表示赞赏!
谢谢!
我认为正确的解决方案是:
( shopt -s nullglob ; echo *.* )
这有点冗长,但无论您拥有什么样的时髦文件名,它都将始终有效。(管道传输的问题ls
是grep
典型的系统允许文件名中包含非常奇怪的字符,例如,包括换行符。)
该shopt -s nullglob
部分启用(“ s ets”)nullglob
shell opt选项,它告诉 Bash 如果没有文件名称匹配,则应该删除(即,应该扩展为空)而不是单独放置。*.*
*.*
括号(...)
是设置一个子shell,所以这个nullglob
选项只对脚本的这个小部分启用。
尝试
ls -1 | grep "\."
仅列出具有扩展名的文件,如果没有文件,则不列出任何文件(空列表):就像您需要的那样。
使用 Linux grep,您可以添加 -v 以获取没有扩展名的文件列表。
了解 shell 模式和正则表达式之间的区别很重要。Shell 模式稍微简单一些,但灵活性较差。grep 使用正则表达式匹配。贝壳图案,如
*.*
将使用正则表达式完成
.*\..*
但是 grep 中的正则表达式没有锚定,这意味着它会在行的任何位置搜索匹配项,因此这两个.*
部分是不必要的。