致命:搜索和替换后未知的索引条目格式

致命:搜索和替换后未知的索引条目格式

如何在 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

字符串oldnew是占位符。

答案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 \)

相关内容