我的主目录中有无数目录。每个目录都有多个级别的子目录。其中分布着一些名为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