【问题标题】:linux replace path with path in files recursivelylinux用文件中的路径递归替换路径
【发布时间】:2018-03-28 15:30:44
【问题描述】:

给定一个名为FOO的主目录,里面有很多子目录,我想去每个子目录,找到路径:

/mango/pears/peanuts/butter/ 

将/mango/pears 替换为/supplier

我知道sed 是我要找的,但我can't 想通了:

cd /FOO
sed -i 's|/mango/pears|/supplier|g' $(find . -type f)

有什么想法吗?这个问题不寻求像this中那样重命名文件

【问题讨论】:

标签: linux sed path


【解决方案1】:

要查找 FOO 中包含 /mango/pears/peanuts/butter/ 的每条路径,您可以使用:

find /FOO -path "*/mango/pears/peanuts/butter/*"

如果你想修改结果列表,你可以通过 sed 管道输出(但没有 -i,它只对要更改的文件有意义):

find /FOO -path "*/mango/pears/peanuts/butter/*" -type f | sed 's|/mango/pears|/supplier|g' 

Sed -i 适用于 sed 的每个结果,但会更改文件中的此类路径。这可能适用于您的命令,但容易受到文件名中空格的影响。相反,您应该使用 -exec 参数:

find /FOO -path "*/mango/pears/peanuts/butter/*" -type f -exec sed -i  's|/mango/pears|/supplier|g' {} ";"

【讨论】:

  • 感谢详细的解决方案。如果我只想更改.sh 文件中的路径而不接触.nc4 和其他文件怎么办?
  • 您将在“-type f”之后和“-exec ...”之前附加参数`-name“*.sh”` - 小心!参数的顺序可以并且经常影响 find 命令。在测试之前阅读手册页,在测试之前测试并备份敏感数据。但随着时间的推移,find 将成为您最快、最强大的工具之一。
猜你喜欢
  • 2021-02-27
  • 2017-12-17
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多