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

Min*_*int 140 macos bash shell grep

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

ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?PS,在Slow Leopard上运行此脚本.

med*_*iev 319

为什么不:

ls *.{mp3,exe,mp4}
Run Code Online (Sandbox Code Playgroud)

我不知道我在哪里学到它 - 但我一直在使用它.

  • 我喜欢这个解决方案,但如果您缺少任何一种文件类型,它似乎会失败.例如,你有mp3但没有.exe(Mac OSX,zsh) (10认同)
  • @JHo使用ls*.mp3 (4认同)
  • 我将 stderr 重定向到 /dev/null 以避免 `ls: *.exe: No such file or directory` 例如:`ls *.{zip,tar.gz,tar} 2>/dev/null` (3认同)
  • 当我直接在 shell 中运行 ls foo*.{tar.gz,zip} 时,它可以工作,但是当将其放入 shell 脚本latest=$(ls -I '*.done' -tr ${pkgprefix}*.{ tar.gz,zip} | tail -1) 我收到一条错误消息: ls: 无法访问 'bamtools*.{tar.gz,zip}': 没有这样的文件或目录,任何聪明的人都可以完善答案。 (3认同)

Pau*_*ce. 42

使用正则表达式find:

find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\n'
Run Code Online (Sandbox Code Playgroud)

如果您正在管道文件名:

find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\0' | xargs -0 dosomething
Run Code Online (Sandbox Code Playgroud)

这可以保护包含空格或换行符的文件名.

OS X find仅在使用-E(增强)选项时支持交替.

find -E . -regex '.*\.(mp3|mp4|exe)'
Run Code Online (Sandbox Code Playgroud)

  • andi,在mac os上对我不起作用.但这样做:找到-E.-regex'.*(mp3 | mp4 | exe)' (3认同)
  • 在Mac OS X上:`find.-iregex'.*\(mp3\| mp4\| exe \)'` (2认同)

mob*_*mob 35

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

ls | egrep '\.mp4$|\.mp3$|\.exe$'
Run Code Online (Sandbox Code Playgroud)

应该做的工作.

  • @camh:`ls`到终端(或`-C`选项)产生多列输出.管道(或带有"-1")的`ls`具有单列输出.(将`ls`的输出与'ls | cat`进行比较). (4认同)

Jos*_*a K 12

最简单的方法就是使用ls

ls *.mp4 *.mp3 *.exe
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但我已经尝试过了,我不喜欢没有文件时得到的错误.你可以通过这样做来修复:ls*.mp4*.mp3*.exe 2>/dev/null现在只想到你:P (2认同)
  • 在 bash 中,您可以执行“set -o nullglob”,并且不会出现错误。 (2认同)
  • 我的错误 - 应该是“shopt -s nullglob”而不是 set -o 命令 (2认同)
  • 或者只使用“echo”:echo *.mp4 *.mp3 *.exe (2认同)

P S*_*ved 9

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

find -iname '*.mp3' -o -iname '*.exe' -o -iname '*.mp4'
Run Code Online (Sandbox Code Playgroud)


cam*_*amh 5

不需要grep.壳牌通配符可以解决问题.

ls *.mp4 *.mp3 *.exe
Run Code Online (Sandbox Code Playgroud)

如果你跑了

shopt -s nullglob
Run Code Online (Sandbox Code Playgroud)

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

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

shopt -s nocaseglob
Run Code Online (Sandbox Code Playgroud)

  • 我尝试将其与“-R”选项一起使用来列出子目录中的匹配文件,但该选项似乎没有任何效果,我仍然只获得当前目录的结果。 (2认同)

Hai*_* Vu 5

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

ls | grep -i -e '\\.tcl$' -e '\\.exe$' -e '\\.mp4$'
Run Code Online (Sandbox Code Playgroud)

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


jam*_*yle 5

对于OSX用户

如果使用ls *.{mp3,exe,mp4},如果其中一个扩展名没有结果,它将引发错误

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

  • 使用您的示例出现语法错误???'bash:意外令牌'('附近的语法错误 (3认同)
  • 我猜你是说`ls *。@(mp3 | exe | mp4)`。您需要`shopt -s extglob`才能正常工作。顺便说一句,`ls`也没用,您可以执行`printf'%s \ n'*。@(mp3 | exe | mp4)`。 (2认同)