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

时间:2009-09-19 03:21:22

标签: bash shell macos grep

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

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

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

有什么想法吗? PS,在Slow Leopard上运行此脚本。

12 个答案:

答案 0 :(得分:300)

为什么不:

ls *.{mp3,exe,mp4}

我不确定我在哪里学到它 - 但我一直在使用它。

答案 1 :(得分:41)

使用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)'

答案 2 :(得分:32)

egrep - 扩展grep - 将在这里提供帮助

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

应该做的。

答案 3 :(得分:11)

最简单的方法就是使用ls

ls *.mp4 *.mp3 *.exe

答案 4 :(得分:8)

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

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

答案 5 :(得分:5)

不需要grep。 Shell通配符可以解决问题。

ls *.mp4 *.mp3 *.exe

如果你已经运行

shopt -s nullglob

然后将完全删除不匹配的globs,而不是保留在未扩展的命令行上。

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

shopt -s nocaseglob

答案 6 :(得分:4)

如果您仍在寻找替代解决方案:

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

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

答案 7 :(得分:4)

对于OSX用户

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

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

答案 8 :(得分:2)

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

答案 9 :(得分:2)

ls -R | findstr ".mp3"

ls -R =>以递归方式列出子目录

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

尝试使用此命令很容易:

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