0

我只需要使用 ls 查找具有扩展名的目录中的文件(不能使用 find)。

我试过 ls *.*,但如果 dir 不包含任何带扩展名的文件,它会返回“没有这样的文件或目录”。

如果有扩展名的文件,我不希望出现该错误并希望 ls 返回到 cmd 提示符。

我试图将 grep 与 ls 一起使用来实现相同的目的。

ls|grep "*.*" - 不起作用,但 ls | grep "\." 作品。

我不知道为什么 grep *.* 不起作用。任何帮助表示赞赏!

谢谢!

4

3 回答 3

2

我认为正确的解决方案是:

( shopt -s nullglob ; echo *.* )

这有点冗长,但无论您拥有什么样的时髦文件名,它都将始终有效。(管道传输的问题lsgrep典型的系统允许文件名中包含非常奇怪的字符,例如,包括换行符。)

shopt -s nullglob部分启用(“ s ets”)nullglob shell opt选项,它告诉 Bash 如果没有文件名称匹配,则应该删除(即,应该扩展为)而不是单独放置。*.**.*

括号(...)是设置一个子shell,所以这个nullglob选项只对脚本的这个小部分启用。

于 2013-04-08T04:04:30.637 回答
1

尝试

ls -1 | grep "\."

仅列出具有扩展名的文件,如果没有文件,则不列出任何文件(空列表):就像您需要的那样。

使用 Linux grep,您可以添加 -v 以获取没有扩展名的文件列表。

于 2014-03-20T19:25:03.740 回答
1

了解 shell 模式和正则表达式之间的区别很重要。Shell 模式稍微简单一些,但灵活性较差。grep 使用正则表达式匹配。贝壳图案,如

*.*

将使用正则表达式完成

.*\..*

但是 grep 中的正则表达式没有锚定,这意味着它会在行的任何位置搜索匹配项,因此这两个.*部分是不必要的。

于 2013-04-08T03:58:33.160 回答