2

关于这篇文章,我将如何从应用字符串替换中排除一个或多个文件?通过使用上述帖子作为示例,我希望能够在给定目录的所有后代文件中将“apples”替换为“oranges” 例如./fpd/font/symbol.php.

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

4

3 回答 3

1

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

find . -path ./fpd/font/symbol.php -prune -o -exec sed -i 's/apple/orange/g' {} \;
于 2013-10-29T17:38:07.357 回答
1

!您可以用(或-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
于 2013-10-29T17:44:44.243 回答
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 环境中,它无法打开路径或名称中有空格的文件。从来没想过那个。如果有人知道如何解决这个问题,我想知道。

于 2013-10-29T17:45:12.037 回答