我只想从当前目录中获取文件,只输出.mp4 .mp3 .exe文件。 所以我想我可以这样做:
ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$
但不是,因为第一个grep只输出mp4,所以不会使用其他2个grep。
有什么想法吗? PS,在Slow Leopard上运行此脚本。
答案 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