【问题标题】:Shell using sed to remove file extension from find resultsShell 使用 sed 从查找结果中删除文件扩展名
【发布时间】:2018-10-27 00:58:23
【问题描述】:

我正在尝试运行

find . \ -type f -name "*.sh" -exec basename {} \; | sed "s/.sh/ "

显示当前目录和以 .sh 结尾的子目录中的所有文件。我使用-exec basename {} 来删除文件的位置,所以我只是自己获取文件名。 find 命令工作正常,但是当我将它通过管道传输到sed "s/.sh/ " 时,我收到一条错误消息sed: 1: "s/.sh/ ": unterminated substitute in regular expression。我正在尝试用任何内容替换 .sh 扩展名,所以我只获取文件名。

【问题讨论】:

    标签: bash shell sed find


    【解决方案1】:

    您只是缺少 sed 上的关闭 /

    find . -type f -name "*.sh" -exec basename {} \;  | sed "s/\.sh//"
    

    【讨论】:

    • 非常感谢!这很好用,但不幸的是,在打印文件名后,它会打印find: -type: no such file or directory . find: f: no such file or directory 编辑:看到编辑,非常感谢,这很好用!
    • 问题在于find . 之后的\ 字符。扔掉它。我将响应更改为反映。
    • 我在一个名为find_sh.sh 的shell 文件中有这个。知道为什么当我运行./find_sh.sh | cat -e 时它会打印find.sh$ 而不是预期的find_sh$
    • 转义点sed "s/\.sh//"
    • 谢谢,效果很好,但为什么呢?这和省略点有什么区别?
    【解决方案2】:

    basename 可以为你删除扩展。

    find . -type f -name '*.sh' -exec basename {} .sh \;
    

    请注意,这将适用于所有个有效文件名,而不仅仅是不包含换行符的文件名。

    如果您的basename 命令支持它,您可以使用-s 选项来最小化您需要调用basename 的次数。

    find . -type f -name '*.sh' -exec basename -s .sh {} +
    

    这允许将多个文件名传递给对basename 的每次调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      相关资源
      最近更新 更多