如何在 Linux 上执行此搜索和替换而不出现错误?
$ git status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
$ find . -not -path './.git' -type f -exec sed -i -e 's/old/new/g' -e 's/old2/new2/g' {} +
$ git status
fatal: unknown index entry format 0x74650000
字符串old
和new
是占位符。
答案1
-path
的测试find
匹配全部的姓名。来自man find
(强调我的):
-路径模式
文件名与 shell 模式匹配。元字符不处理
/' or
.'特别;所以,例如,find . -path "./sr*sc"
将打印名为 ./src/misc 的目录的条目(如果存在)。 要忽略整个目录树,请使用 -prune 而不是检查树中的每个文件。请注意,模式匹配测试适用于整个文件名,从命令行上命名的起点之一开始。仅当相关起点也是绝对路径时,此处使用绝对路径名才有意义。这意味着该命令永远不会匹配任何内容:
find bar -path /foo/bar/myfile -print
Find 将 -path 参数与目录名和它正在检查的文件的基本名称的串联进行比较。由于串联永远不会以斜杠结束,因此以斜杠结尾的 -path 参数将不会匹配任何内容(可能除了在命令行上指定的起点)。 HP-UX find 也支持谓词 -path,它是 POSIX 2008 标准的一部分。
所以你-not -path './.git'
实际上并没有排除任何东西。例如,在我的一个存储库上:
$ find . -not -path './.git' -type f | grep -m5 git
./.git/COMMIT_EDITMSG
./.git/logs/HEAD
./.git/logs/refs/heads/master
./.git/description
./.git/HEAD
您想使用类似的东西,它排除以./git/
任何(或没有)字符开头和后跟的文件:
find . -not -path './.git/*' -type f
但即便如此也不是你真正想要的。您只想跳过整个./.git
子目录,这就是-prune
我上面引用的手册页中提到的:
find . -type f \( -path './.git/*' -o -print \)