使用 ls 和 grep 列出具有某些扩展名的文件

我只想从当前目录中获取文件,并且只输出.mp4.mp3.exe 文件。 所以我想我可以这么做:

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

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

有什么想法吗? 附言,在慢豹上运行这个脚本。

291967 次浏览

egrep——扩展 grep ——在这里会有帮助

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

应该可以。

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

最简单的方法就是使用 ls

ls *.mp4 *.mp3 *.exe

不需要 grep,Shell 通配符就可以了。

ls *.mp4 *.mp3 *.exe

如果你跑了

shopt -s nullglob

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

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

shopt -s nocaseglob

以防万一: 为什么不用 find呢?

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

如果你还在寻找替代方案:

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

如果需要,可以随意添加更多的 e 标志。

为什么不:

ls *.{mp3,exe,mp4}

我不知道我从哪里学来的,但我一直在用这个。

find中使用正则表达式:

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

如果你在用管道输送文件名:

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

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

OS X find只在使用 -E(增强)选项时支持更改。

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

ls -R | findstr ".mp3"

ls -R = > 递归地列出子目录

对于 OSX 用户 :

如果使用 ls *.{mp3,exe,mp4},如果其中一个扩展没有结果,则使用 它会抛出一个错误

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

这里有一个对我有用的例子。

find <mainfolder path> -name '*myfiles.java' | xargs -n 1 basename

使用这个命令很容易:

ls | grep \.txt$ && ls | grep \.exe