【问题标题】:List files with certain extensions with ls and grep使用 ls 和 grep 列出具有特定扩展名的文件
【发布时间】:2010-11-29 16:14:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这确实是错误的方法——不要使用 grep,而是使用 shopt -s nullglob,然后只引用 *.exe *.mp3 *.mp4。见mywiki.wooledge.org/ParsingLs
  • 我不知道“Slow Leopard”是否是错字...
  • @Wowfunhappy 哈哈哈,肯定是打错了,我记得还以为雪豹挺快的。

标签: bash shell macos grep


【解决方案1】:

很容易尝试使用这个命令:

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

【讨论】:

    【解决方案2】:

    这是一个对我有用的例子。

    find <mainfolder path> -name '*myfiles.java' | xargs -n 1 basename
    

    【讨论】:

      【解决方案3】:

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

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

      应该做的工作。

      【讨论】:

      • 就是这样!谢谢刚刚意识到我应该让它不区分大小写,所以我正在使用:ls | egrep -i '\.mp4$|\.mp3$|\.exe$ 以防万一有一天其他人需要帮助。我总是对我在这里得到答案的速度感到惊讶。
      • 我看不出这是如何工作的。没有任何选项的 ls 会在列中生成输出。锚定到行尾将无法正确匹配。
      • @camh: ls 到终端(或使用-C 选项)产生多列输出。 ls 到管道(或 -1)具有单列输出。 (比较lsls | cat 的输出)。
      • 末尾缺少撇号。除此之外,它似乎有效。
      【解决方案4】:

      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)'
      

      【讨论】:

      • 在 Mac OS X 上:find . -iregex '.*\(mp3\|mp4\|exe\)'
      • andi,这在 mac os 上对我不起作用。但这确实: find -E 。 -regex '.*(mp3|mp4|exe)'
      • 此解决方案将加载如下文件:mysupermp3.jpg 考虑在正则表达式末尾添加$,在扩展前添加\\.
      • @Panthro:实际上,它不会。 Find 似乎使用了隐含的锚点。点是个好主意(只需要一个反斜杠)。
      【解决方案5】:

      对于 OSX 用户

      如果你使用ls *.{mp3,exe,mp4},如果其中一个扩展没有结果,会抛出错误

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

      【讨论】:

      • 我在使用你的例子时遇到了语法错误??? 'bash:意外标记附近的语法错误`('
      • 我猜你的意思是ls *.@(mp3|exe|mp4)。你需要shopt -s extglob 才能工作。顺便说一句,ls 也没什么用,你可以用printf '%s\n' *.@(mp3|exe|mp4)
      • 我在 macOS 10.13 上收到语法意外令牌消息
      【解决方案6】:

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

      ls | grep -i -e '\\.tcl$' -e '\\.exe$' -e '\\.mp4$'
      

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

      【讨论】:

        【解决方案7】:

        ls -R | findstr ".mp3"

        ls -R => 递归列出子目录

        【讨论】:

          【解决方案8】:

          为什么不:

          ls *.{mp3,exe,mp4}
          

          我不确定我是从哪里学到的 - 但我一直在使用它。

          【讨论】:

          • 这对我不起作用,因为我使用的扩展名用于目录,所以 ls 列出了目录的内容。
          • @RichardVenable 添加 -d 开关以防止目录被递归。
          • 我喜欢这个解决方案,但如果您缺少任何一种文件类型,它似乎会失败。例如,您有 mp3 但没有 .exe(Mac OSX、zsh)
          • 我将 stderr 重定向到 /dev/null 以避免ls: *.exe: No such file or directory 例如:ls *.{zip,tar.gz,tar} 2&gt;/dev/null
          • 当我直接在 shell 中运行 ls foo*.{tar.gz,zip} 时它可以工作,但是当把它放在 shell 脚本中时 latest=$(ls -I '.done ' -tr ${pkgprefix}.{tar.gz,zip} | tail -1) 我收到一条错误消息:ls: cannot access 'bamtools*.{tar.gz,zip}': No such file或目录,任何更聪明的人都可以完善答案。
          【解决方案9】:

          最简单的方法就是使用 ls

          ls *.mp4 *.mp3 *.exe
          

          【讨论】:

          • 谢谢,但我已经尝试过了,我不喜欢没有文件时出现的错误。你我可以通过这样做来解决这个问题: ls *.mp4 *.mp3 *.exe 2> /dev/null 现在你才想到这个:P
          • 我很惊讶ls 没有某种静音选项。
          • 在 bash 中,你可以执行“set -o nullglob”,你不会得到错误。
          • 我的错误——应该是“shopt -s nullglob”而不是 set -o 命令
          • 或者只使用“echo”:echo *.mp4 *.mp3 *.exe
          【解决方案10】:

          不需要grep。 Shell 通配符可以解决问题。

          ls *.mp4 *.mp3 *.exe
          

          如果你跑过

          shopt -s nullglob
          

          然后不匹配的 glob 将被完全删除,并且不会留在未展开的命令行中。

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

          shopt -s nocaseglob
          

          【讨论】:

          • 与我给 Good Time Tribe 的评论相同。
          • 我正在尝试将其与 -R 选项一起使用以列出子目录中的匹配文件,但该选项似乎没有任何效果,我仍然只能得到当前目录的结果。
          【解决方案11】:

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

          find -iname '*.mp3' -o -iname '*.exe' -o -iname '*.mp4'
          

          【讨论】:

          • 我发现这可以代替 - find . -name '*.mkv' -o -name '*.flv' (根据需要添加尽可能多的 -o 子句)。我需要 . 来指示目录和标志 -name 而不是 -iname - 我在 macOS 10.13 上。
          【解决方案12】:
          ls | grep "\.mp4$
          \.mp3$
          \.exe$"
          

          【讨论】:

          • 谢谢,但是用了几行有点不方便。
          • 这个 + mdfind 产生有史以来最好/最快的搜索! mdfind -name querystring | grep "\.h$" 查找文件标题中带有 quesrystring 的所有标题。很快。
          猜你喜欢
          • 2017-02-06
          • 2020-04-05
          • 1970-01-01
          • 2013-03-30
          • 2011-09-25
          • 1970-01-01
          • 1970-01-01
          • 2013-09-20
          • 2018-04-27
          相关资源
          最近更新 更多