如何在一个目录和除一个子目录之外的所有子目录中的所有文件中执行某些操作(例如,替换字符串)?

如何在一个目录和除一个子目录之外的所有子目录中的所有文件中执行某些操作(例如,替换字符串)?

我正在使用以下命令

find . -type f -exec sed -i 's/_backpack.html/_backpack_cal.html/g' {} +

我希望项目中的所有“_backpack.html”字符串都替换为_backpack_cal.html,并且会发生这种情况。

但是,问题是它还会编辑我的.git目录中的文件,这会损坏 Git。如何在处理所有其他子目录的同时防止find触摸我的目录?.git

答案1

你可以使用:

find . -name .git -prune -o -type f -exec sed -i 's/_backpack.html/_backpack_cal.html/g' {} +

我添加的-name .git -prune部分基本上意味着“如果目录的名称是.git,则不处理该目录。”

另外,请注意添加的-o(意思是or),它仅在第一个为 false 时才执行您的语句(即,如果处理的文件的名称是目录.git)。

当然,您应该在实际执行命令之前对此进行测试,例如将-exec ...部分替换为。-print

答案2

如果您只想排除.git

find . ! -path '.git/*' -type f

要排除所有隐藏文件和目录:

find . ! -path '*/.*' -type f

相关内容