【问题标题】:find only files with extension using ls使用 ls 仅查找具有扩展名的文件
【发布时间】:2013-03-30 01:17:43
【问题描述】:

我只需要使用 ls 查找具有扩展名的目录中的文件(不能使用 find)。

我试过 ls *.*,但如果 dir 不包含任何带扩展名的文件,它会返回“没有这样的文件或目录”。

我不希望出现这个错误,如果有扩展名的文件,我希望 ls 返回到 cmd 提示符。

我尝试使用 grep 和 ls 来达到同样的效果。

ls|grep "*.*" - 不起作用 但是 ls | grep "\."有效。

我不知道为什么 grep *.* 不起作用。任何帮助表示赞赏!

谢谢!

【问题讨论】:

  • ls|grep '\.'怎么样
  • 是的,如上所述,它有效。你能解释一下为什么会这样,为什么 *.* 不会吗?
  • ls *.{mp3,exe,mp4} 这个问题应该有帮助:stackoverflow.com/questions/1447625/…
  • grep 使用正则表达式,而不是 shell 模式
  • ls 不是这项工作的工具。您需要使用find。无论对find 的限制是什么,请告诉我们,我们将帮助您解决它。

标签: linux bash ls


【解决方案1】:

我认为正确的解决方案是这样的:

( shopt -s nullglob ; echo *.* )

这有点冗长,但无论您拥有什么样的时髦文件名,它都将始终有效。 (管道 ls 到 grep 的问题是典型的系统允许文件名中包含非常奇怪的字符,例如换行符。)

shopt -s nullglob 部分启用 ("sets") nullglob shell opt选项,它告诉 Bash 如果没有名称与*.* 匹配的文件,则应删除*.*(即应扩展为空)而不是单独放置。

括号(...)是设置子shell,所以nullglob选项只对脚本的这小部分启用。

【讨论】:

    【解决方案2】:

    了解 shell 模式和正则表达式之间的区别很重要。 Shell 模式稍微简单一些,但灵活性较差。 grep 使用正则表达式匹配。像

    这样的shell模式
    *.*
    

    将使用正则表达式作为

    .*\..*
    

    但是 grep 中的正则表达式没有锚定,这意味着它会在行中的任何位置搜索匹配项,从而不需要两个 .* 部分。

    【讨论】:

      【解决方案3】:

      试试

      ls -1 | grep "\."
      

      仅列出具有扩展名的文件,如果没有文件,则不列出任何内容(空列表):就像您需要的那样。

      使用 Linux grep,您可以添加 -v 以获取不带扩展名的文件列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-29
        • 1970-01-01
        • 2011-08-21
        • 2019-07-21
        • 1970-01-01
        • 2011-03-10
        • 1970-01-01
        相关资源
        最近更新 更多