【问题标题】:Find & replace recursively except for certain files除某些文件外,递归查找和替换
【发布时间】:2013-10-29 17:31:07
【问题描述】:

关于this post,我如何将一个或多个文件排除在应用字符串替换之外?以上述帖子为例,我希望能够在给定目录除了的所有后代文件中将“apples”替换为“oranges”,例如./fpd/font/symbol.php

我的想法是在 find 命令中使用 -regex 开关,但不幸的是它没有像 grep 命令那样的 -v 选项,因此我不能将正则表达式否定为 not匹配必须发生替换的文件。

【问题讨论】:

    标签: regex linux shell sed


    【解决方案1】:

    我在我的 Git 存储库中使用它:

    grep -ilr orange . | grep -v ".git" | grep -e "\\.php$" | xargs sed -i s/orange/apple/g {}
    

    它会:

    1. 仅在实际包含要替换的单词的文件中运行查找和替换;
    2. 不处理.git文件夹;
    3. 仅处理 .php 文件。

    不用说,您可以包含任意数量的grep 层,以过滤传递给xargs 的列表。

    已知问题:

    至少在我的 Windows 环境中,它无法打开路径或名称中有空格的文件。从来没想过那个。如果有人知道如何解决这个问题,我想知道。

    【讨论】:

    • 这很好用!我稍微调整了一下:default="myApp"; grep -Rl $default . | grep -v ".git" | grep -v "angular.js" | grep -v $0 | xargs sed -i "s/$default/somethingElse/g"; 基本上 id 所做的是将 angularjs-seed 应用程序(“myApp”)的默认名称替换为整个项目中的其他名称(可以是用户定义的),除了 .git 内部文件夹、文件 angular.js(它作为示例出现在注释块中)和脚本本身。很好的答案! :)
    • 顺便说一句,根据您的示例在命令末尾添加 {} 会导致以下警告:sed: can't read {}: No such file or directory 所以我省略了它,它就像一个魅力!
    【解决方案2】:

    尚未对此进行测试,但应该可以:

    find . -path ./fpd/font/symbol.php -prune -o -exec sed -i 's/apple/orange/g' {} \;
    

    【讨论】:

      【解决方案3】:

      您可以将!(或-not)与-name结合使用来否定:

      $ find .
      .
      ./a
      ./a/b.txt
      ./b
      ./b/a.txt
      $ find . -name \*a\* -print
      ./a
      ./b/a.txt
      $ find . ! -name \*a\* -print
      .
      ./a/b.txt
      ./b
      $ find . -not -name \*a\* -print
      .
      ./a/b.txt
      ./b
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-28
        • 2011-10-23
        • 2023-03-25
        • 2012-03-12
        • 2018-04-10
        • 2013-05-26
        相关资源
        最近更新 更多