我只想从当前目录中获取文件,并且只输出.mp4.mp3.exe 文件。 所以我想我可以这么做:
ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$
但是不行,因为第一个 grep 只输出 mp4,所以其他两个 grep 不会被使用。
有什么想法吗? 附言,在慢豹上运行这个脚本。
egrep——扩展 grep ——在这里会有帮助
egrep
ls | egrep '\.mp4$|\.mp3$|\.exe$'
应该可以。
ls | grep "\.mp4$ \.mp3$ \.exe$"
最简单的方法就是使用 ls
ls *.mp4 *.mp3 *.exe
不需要 grep,Shell 通配符就可以了。
如果你跑了
shopt -s nullglob
那么不匹配的球体将被完全删除,而不是留在命令行上不展开。
如果您想要不区分大小写的 globbing (所以 * . mp3将与 foo.MP3匹配) :
shopt -s nocaseglob
以防万一: 为什么不用 find呢?
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(增强)选项时支持更改。
-E
find -E . -regex '.*\.(mp3|mp4|exe)'
ls -R | findstr ".mp3"
ls -R = > 递归地列出子目录
ls -R
对于 OSX 用户 :
如果使用 ls *.{mp3,exe,mp4},如果其中一个扩展没有结果,则使用 它会抛出一个错误。
使用 ls *.(mp3|exe|mp4)将返回与这些扩展名 即使其中一个扩展的结果为0匹配的所有文件。
ls *.(mp3|exe|mp4)
这里有一个对我有用的例子。
find <mainfolder path> -name '*myfiles.java' | xargs -n 1 basename
使用这个命令很容易:
ls | grep \.txt$ && ls | grep \.exe