关于这篇文章,我将如何从应用字符串替换中排除一个或多个文件?通过使用上述帖子作为示例,我希望能够在给定目录的所有后代文件中将“apples”替换为“oranges” ,例如./fpd/font/symbol.php
.
我的想法是-regex
在 find 命令中使用开关,但不幸的是它没有-v
像命令这样的选项,grep
因此我不能否定正则表达式与必须发生替换的文件不匹配。
尚未对此进行测试,但它应该可以工作:
find . -path ./fpd/font/symbol.php -prune -o -exec sed -i 's/apple/orange/g' {} \;
!
您可以用(或-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
我在我的 Git 存储库中使用它:
grep -ilr orange . | grep -v ".git" | grep -e "\\.php$" | xargs sed -i s/orange/apple/g {}
它会:
.git
文件夹;.php
文件。不用说,您可以包含grep
要过滤传递给的列表的尽可能多的层xargs
。
已知的问题:
至少在我的 Windows 环境中,它无法打开路径或名称中有空格的文件。从来没想过那个。如果有人知道如何解决这个问题,我想知道。