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