2013-04-08 79 views
0

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

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

我不想要那个错误,并且想让ls返回到cmd提示符,如果有扩展名的文件。

我试图使用gre与ls来实现相同。

ls | grep“*。*” - 不起作用 但是ls | grep“\”。作品。

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

谢谢!

+0

'ls | grep'\。'' – 2013-04-08 03:51:45

+0

是的,正如上面提到的那样。你能解释它为什么会这样做,为什么\ *。\ *不会? – 2013-04-08 03:53:16

+1

'ls *。{mp3,exe,mp4}' 这个问题应该有所帮助:http:// stackoverflow。com/questions/1447625/list-files-with-certain-extensions-with-ls-and-grep – 2013-04-08 03:53:52

回答

1

理解shell模式和正则表达式之间的区别很重要。壳模式有点简单,但不够灵活。 grep使用正则表达式匹配。像

*.* 

甲壳图案将与正则表达式来完成作为

.*\..* 

但在grep的正则表达式不固定的,这意味着它搜索的匹配就行的任何地方,使两个.*部件不必要。

2

我认为正确的解决办法是这样的:

(shopt -s nullglob ; echo *.*) 

这是一个有点冗长,但它永远是可行的,不管你有什么样时髦的文件名。 (带管道lsgrep的问题是,典型的系统允许在文件名中确实离奇字符,包括,例如,换行。)

shopt -s nullglob部分启用(“小号 ETS”)的nullglobSH ELL 选择选项,它告诉Bash如果没有文件的名称匹配*.*,那么*.*应该被删除(即应该扩展为无),而不是单独放置。

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

1

尝试

ls -1 | grep "\." 

名单只有具有扩展和无(空单)文件,如果没有文件:喜欢你的需要。

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