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