【问题标题】:Running multiple find and sed in a bash file在 bash 文件中运行多个 find 和 sed
【发布时间】:2015-01-22 01:10:04
【问题描述】:

我有下面的代码

find . -type f -exec sed -i  's#<![endif]>##g' {} +
find . -type f -exec sed -i  's#<script src="/js/vendor/modernizr-2.6.2.min.js?v=201425100529"></script>##g' {} +   
find . -type f -exec sed -i  's# <!--[if lt IE 9]>##g' {} +       

在 bash 文件中。

如果我直接在终端中运行这些行,它可以工作,但是如果我在一个 sh 文件中一起运行它们,我会遇到错误:

发现:'-exec' 缺少参数

【问题讨论】:

  • 另外,我不确定[endif][if lt IE 9] 之类的搜索模式是否正确(您当然想要\[endif\])并且需要转义一些特殊字符,例如[for 类定义在这种情况下

标签: linux bash sed find


【解决方案1】:

command 执行成功但script 失败的原因是,

当脚本被执行时,find 命令搜索当前执行路径中的所有文件和目录(. 用于find)。同样,这也包括script 本身。这将创建要被sed 覆盖/修改的脚本。

因此,当需要进行文件编辑时,不必将脚本保存在同一目录中,而是可以将脚本保存在其他目录中,并且可以将 absolute path 提供给 find 命令。

并且还建议使用\; 终止命令以指示参数的结束。

始终使用 bash 而不是 sh 执行脚本,这意味着 bourne shell 。通常bash 将是sh 的符号链接,但它将以兼容模式运行,这会导致bash 失去现代功能。

#!/bin/bash

find /Absolute/path -type f -exec sed -i  's#<!\[endif\]>##g' '{}' \;
find /Absolute/path -type f -exec sed -i  's#<script src="/js/vendor/modernizr-2.6.2.min.js?v=201425100529"></script>##g' '{}' \;
find /Absolute/path -type f -exec sed -i  's# <!--\[if lt IE 9\]>##g' '{}' \; 

【讨论】:

  • 即使修改了自身也不会影响脚本的当前执行(仅影响脚本的下一次运行)。 +-exec 的有效参数,在可以找到多个文件并且可以一次处理的情况下更可取;它减少了处理所有文件所需的执行次数。仅当需要在其他情况下使用 bash 功能时才使用 bash 是一个好主意,这是一个糟糕的主意,因为它使您更难知道您何时偏离了 sh 兼容性领域并进入了 bash-特定的行为(并且与 sh 兼容是一件好事)。
  • @EtanReisner 是的 + 可以使用,但 -exec cmd \;-exec cmd + 的方式不同。我想看看这是否有什么不同。对于bash,当用户使用bash 作为默认shell 时,使用sh 执行脚本毫无意义。
  • @KingsleySchmid 你能尝试在大括号周围添加单引号'{}'。也请不要您可能需要添加` to the character classes within the sed`。我已经在答案中更新了这些更改。
  • 用户的默认 shell 是什么并不重要。重要的是脚本是否需要在任何时候在任何其他系统上运行,以及编写脚本的人是否想了解他们何时使用 bash 细节与兼容的 sh 函数。我知道\;+ 之间的唯一区别是一次向命令提供了多少文件。
  • 大家好,我发现在大括号周围添加“{}”引号会有所不同。请参阅链接:content.hccfl.edu/pollock/Unix/FindCmd.htm,如果没有 + 号,查询需要的时间比运行所需的时间长。
猜你喜欢
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 2015-06-12
  • 2020-07-07
  • 2013-10-02
  • 1970-01-01
  • 2017-03-08
相关资源
最近更新 更多