使用ls和grep列出具有特定扩展名的文件

我只是想从当前目录获取文件,只输出.mp4 .mp3 .exe文件没有别的。 所以我想我可以这样做:

ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$ 

但是,不,因为第一个grep会输出mp4的,所以其他的grep不会被使用。

有任何想法吗? PS,在Slow Leopard上运行这个脚本。

为什么不:

 ls *.{mp3,exe,mp4} 

我不知道我在哪里学到了 – 但我一直在使用它。

使用正则expression式find

 find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\n' 

如果你正在pipe道文件名:

 find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\0' | xargs -0 dosomething 

这可以保护包含空格或换行符的文件名。

当使用-E (增强)选项时,OS X find只支持交替。

 find -E . -regex '.*\.(mp3|mp4|exe)' 

egrep – 扩展grep – 将在这里帮助

 ls | egrep '\.mp4$|\.mp3$|\.exe$' 

应该做这个工作。

最简单的方法就是使用ls

 ls *.mp4 *.mp3 *.exe 

以防万一:你为什么不使用find

 find -iname '*.mp3' -o -iname '*.exe' -o -iname '*.mp4' 

不需要grep。 壳牌通配符将做的伎俩。

 ls *.mp4 *.mp3 *.exe 

如果你跑了

 shopt -s nullglob 

那么不匹配的球体将被完全移除,而不会留在未展开的命令行上。

如果你想不区分大小写的globbing(所以* .mp3将匹配foo.MP3):

 shopt -s nocaseglob 

如果您仍然在寻找替代解决scheme:

 ls | grep -i -e '\\.tcl$' -e '\\.exe$' -e '\\.mp4$' 

如果需要,随意添加更多-e标志。

对于OSX用户

如果您使用ls *.{mp3,exe,mp4} ,如果其中一个扩展名没有结果, 则会引发错误

使用ls *.(mp3|exe|mp4)将返回所有匹配这些扩展名的文件, 即使其中一个扩展名有0个结果

 ls | grep "\.mp4$ \.mp3$ \.exe$" 

ls -R | findstr ".mp3"

ls -R =>recursion列出子目录