递归替换多个 Info.plist 文件中的文本

递归替换多个 Info.plist 文件中的文本

我的主目录中有无数目录。每个目录都有多个级别的子目录。其中分布着一些名为Info.plist.

在这些Info.plist文件中,有以下几行:

<string>/Users/Shared/Library/Mail/V7/74309-67B6-44E3-BD66-9384D1E54398/Junk.mbox</string>

这些行可能每个文件有一个或多个,也可能不同,例如

<string>/Users/Shared/Library/Mail/V7/74398/Junk.mbox</string>

<string>/Users/Shared/Library/Mail/V7/7-67B8/Sent.mbox</string>

<string>/Users/Shared/Library/Mail/V7/OLD/Old.mbox</string>

我有兴趣在这些Info.plist文件中找到这些行并将Shared部分更改为Fireball.

所以,前一行将变成

<string>/Users/Fireball/Library/Mail/V7/74398/Junk.mbox</string>

<string>/Users/Fireball/Library/Mail/V7/7-67B8/Sent.mbox</string>

<string>/Users/Fireball/Library/Mail/V7/OLD/Old.mbox</string>

其余部分保持原样。

因此,首先我必须递归扫描目录结构,找到Info.plist它们拥有的所有文件,在每个文件中扫描Info.plist关键字(Shared如果它们在路径中使用)并将其更改为Fireball.

我如何使用一些神奇的 UNIX 命令来做到这一点?

我正在摆弄这个

find . -type f -name Info.plist -exec sed 's/Shared/Fireball/g' {} +

这看起来几乎是有效的,因为它打印以控制台正确的更改,但文件没有更改。

答案1

假设您sed支持-i就地编辑标志(您可能在主流操作系统中遇到的大多数标志都支持),您可以执行以下操作:

find . -type f -name Info.plist -exec sed -i 's/Shared/Fireball/g' {} +

如果没有的话,你可以尝试perl

find . -type f -name Info.plist -exec perl -i -pe 's/Shared/Fireball/g' {} +

只要绝对确保字符串的每个实例Shared都是您要替换的实例即可。为了安全起见,使用更多的路径可能会更安全:

find . -type f -name Info.plist -exec sed -i 's|/Users/Shared/Library/|/Users/Fireball/Library|g' {} +

答案2

命令

find . -type f -iname Info.plist -exec sed "/<string>\/Users\/Shared\/Library\/Mail/s/Shared/Fireball/g" {} \; 2>/dev/null

输出

<string>/Users/Fireball/Library/Mail/V7/74398/Junk.mbox</string>

<string>/Users/Fireball/Library/Mail/V7/7-67B8/Sent.mbox</string>

<string>/Users/Fireball/Library/Mail/V7/OLD/Old.mbox</stri

相关内容