Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用ls和grep列出具有特定扩展名的文件_Bash_Shell_Macos_Grep - Fatal编程技术网

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

Bash 使用ls和grep列出具有特定扩展名的文件,bash,shell,macos,grep,Bash,Shell,Macos,Grep,我只想从当前目录中获取文件,只输出.mp4.mp3.exe文件,而不输出其他文件。 所以我想我可以这样做: ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$ 但是没有,因为第一个grep只输出mp4,所以其他两个grep将不被使用 有什么想法吗?PS,在Slow Leopard上运行此脚本。egrep--扩展的grep--在这里会有所帮助 ls | egrep '\.mp4$|\.mp3$|\.exe$' 应该做这项工作。最简单的方法就是使用ls ls

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

ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$
但是没有,因为第一个grep只输出mp4,所以其他两个grep将不被使用

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

egrep
--扩展的grep--在这里会有所帮助

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

应该做这项工作。

最简单的方法就是使用ls

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

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

ls *.mp4 *.mp3 *.exe
如果你已经跑了

shopt -s nullglob
然后,将完全删除不匹配的glob,而不是将其保留在未展开的命令行上

如果需要不区分大小写的globbing(因此*.mp3将匹配foo.mp3):


以防万一:为什么不使用
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 . -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
find-name'*myfiles.java'| xargs-n1 basename

尝试使用此命令很容易:

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


就这样!谢谢你刚刚意识到我应该不区分大小写,所以我使用:ls | egrep-I'\.mp4$\.mp3$\.exe$,以防有一天其他人需要帮助。我总是对我在这里得到答案的速度感到惊讶。我不知道这是怎么回事。没有任何选项的ls生成列中的输出。锚定到行尾将无法正确匹配。@camh:
ls
到终端(或使用
-C
选项)将产生多列输出<到管道(或带有
-1
的管道)的code>ls
具有单列输出。(将
ls
的输出与
ls | cat
进行比较)。末尾缺少一个撇号。除此之外,它似乎还能工作。谢谢,但是用了几行有点不方便。这个+
mdfind
产生了有史以来最好/最快的搜索
mdfind-name querystring | grep“\.h$”
查找文件标题中包含quesrysting的所有标题。很快。谢谢,但我已经试过了,我不喜欢没有文件时出现的错误。你我可以通过这样做来修复这个问题:ls*.mp4*.mp3*.exe 2>/dev/null现在只想到了这一点。你:PI很惊讶
ls
没有某种静默选项。在bash中,你可以执行“set-o nullglob”,并且你不会得到错误。我的错误-应该是“shopt-s nullglob”,而不是set-o命令,或者只是使用“echo”:echo*.mp4*.mp3*.exe与我给Good Time Tribe的评论相同。我试图将此选项与
-R
选项一起使用,以列出子目录中的匹配文件,但该选项似乎没有任何效果,我仍然只得到当前目录的结果。这确实是错误的方法——而不是使用grep,使用shopt-s nullglob,然后只需参考
*.exe*.mp3*.mp4
。看,我不知道“Slow Leopard”是否是一个输入错误…@wowfHahaha,肯定是一个输入错误,我记得我认为Snow Leopard相当快。这对我不起作用,因为我使用的扩展是一个目录,因此ls列出了目录的内容。@RichardVenable添加-d开关以防止目录被递归。我喜欢这个解决方案,但如果缺少任何一个文件类型,它似乎会失败。例如,您有mp3但没有.exe(Mac OSX,zsh),我将stderr重定向到/dev/null以避免
ls:.exe:没有这样的文件或目录
eg:
ls*{zip,tar.gz,tar}2>/dev/null
,当我在shell中直接运行ls foo*{tar gz,zip}时,它可以工作,但当将其放入shell脚本latest=$(ls-I'-I'-done'-tr${pkgprefix}{tar gz,zip}| tail-1)我收到一条错误消息:ls:无法访问“bamtools*{tar.gz,zip}”:没有这样的文件或目录,任何更聪明的人都可以完善答案。在Mac OS X上:
find-iregex“*\(mp3\| mp4\| exe\)”
andi,这对我在mac操作系统上不起作用。但这确实是:find-E-这个解决方案将加载文件:<代码> MySuxMP3..jpg < /Cord>考虑在ReX结尾处添加<代码> $<代码>,在代码之前> <代码> \>代码>extensions@Panthro:事实上,不会的。“查找”似乎使用隐含的锚。点是个好主意(只需要一个反斜杠)。我用你的例子发现了一个语法错误bash:意外标记附近出现语法错误“(“我猜你的意思是
ls*@(mp3\exe\mp4)
。你需要
shopt-s extglob
才能工作。顺便说一句,
ls
也没用,你可以只做
printf'%s\n'*.@(mp3\exe\mp4)
。我在macOS 10.13上收到了语法意外的令牌消息,我发现它起了作用-
查找-name'*.mkv'-o-name'*.flv'
(根据需要添加尽可能多的-o子句)。我需要
来指示目录和标志
-name
而不是
-iname
-我在macOS 10.13上。
ls | grep \.txt$ && ls | grep \.exe