私のホームディレクトリには多数のディレクトリがあります。各ディレクトリには複数のレベルのサブディレクトリがあります。その中にはという名前の人もいますInfo.plist
。
このInfo.plist
ファイルには次の行があります。
<string>/Users/Shared/Library/Mail/V7/74309-67B6-44E3-BD66-9384D1E54398/Junk.mbox</string>
この行は、ファイルごとに 1 つ以上であっても異なる場合があります。
<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