使用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列出子目录