PR

TimeMachineの保存先のキャッシュはどこだ?(コマンドで探してみる)

前回(未解決:サーバーへ接続するアドレスを変更後に、元のアドレスで警告が出ます)の続きです。

未だに解決できていません。今回はシェルの話です。

TimeMachineに登録したWindowsマシンの共有先をどこでキャッシュしているのか?

ひょっとして、defaultsコマンドで対象外のplistがあるかも?ということで、すべてのplistを検索してみます。

まずは、どこにplistが格納されているのかをmanから調査します。

$ man -k plist
PlistBuddy(8)            - read and write values to plists
com.apple.Boot.plist(5)  - Configuration plist for Mac OS X booter
getgrouplist(3)          - calculate group access list
httpcfg(1)               - Mono Certificate Management for HttpListener
launchd.plist(5)         - System wide and per-user daemon/agent configuration files
plist(5)                 - property list format
skiplist(n), struct::skiplist(n) - Create and manipulate skiplists
swaplist(n)              - A dialog which allows a user to move options between two lists
xpcservice.plist(5)      - XPC Service configuration keys and values

launchd.plistの説明から、manを見てみる気になりました。
man launchd.plistで確認すると
FILESセクションに5つのフォルダが明記されていました。
~/Library/LaunchAgents 、/Library/LaunchAgents、
/Library/LaunchDaemons /System/Library/LaunchAgents
/System/Library/LaunchDaemons

この5つのフォルダ下の一つ上のフォルダ下を対象にして、
すべてのplistファイルに192.168.0.5が含まれているものを探し出します。

数が多いと、単純ではありませんでした

grep 192.168.0.5 `find . -name “*.plist” -print` とすると、
「No such file or directory」エラーがたくさん出てきます。

findで検索した結果に

スペース、(、)があるフォルダやファイル名があります。

スペースが出てきたところを区切りと見なされて、ちょん切れたパスとなるのが
原因のようです。

また、上記スペース問題を解決したとしても
grepにたくさんの引数を渡すことになり、
Argment list too longが発生します。

$ find . -name “*.plist” -print > /tmp/list.txt ; grep “192.168.0.5” `cat /tmp/list.txt`
-bash: /usr/bin/grep: Argument list too long
(検証用のシェルコマンド)

スペースや(、)等が含まれたパスを”パス”とダブルクォートでくくるとgrepできるようです。
しかし、この”パス”となったリストをある程度大量に渡すと、ところどころちょん切れる問題が発生します。

上記検証を踏まえ、
なるべく手間がかからなくて、単純にいける方法はないかと、考えます。

パスのスペース問題、Argment list too longに対する解決策

1フェーズ目で、grep用のコマンドリストを作成、2フェーズ目でコマンドリストを実行し、結果を検索するという方式にします。

(フェーズ1)$ sudo find . -name "*.plist" -print |sed -e "s/^/plutil -p \"/" | 
       sed -e "s/$/\"| grep 192.168.0.5  /"  >&/tmp/plistsearch
(フェーズ2)$ sudo sh -x /tmp/plistsearch >& /tmp/plistresult; 
        strings /tmp/plistresult | 
       egrep -v "^\+ grep " | less

(見やすくする為に改行しています。実際は改行してはいけません)

使っているコマンドの説明
フェーズ1
 plutil -p “plistのフルパス” | grep 192.168.0.5
 を発見したplistの数分、生成します。
  plutilは、バイナリのplistをxml形式で表示させる目的で使っています。

フェーズ2
 sh -x で実行するコマンド名を出力するようにして実行します。
 実行した結果にバイナリが含まれるので、stringsで文字列だけ抽出しています。
 (egrepが失敗してしまいます)
 egrep -vは、
   192.168.0.5を含むplistをlessで検索する際に
   sh -xの影響で実行コマンド自身のgrep 192.168.0.5が表示されます。
   このgrep 192.168.0.5を除外する目的です。

defultsコマンドでは表示されないデータが存在しているのか?

このフェーズ1、2を各フォルダ毎に繰り返しました。

残念ながら、新しい発見はありませんでした。orz
defaults readと同等のようです。

タイトルとURLをコピーしました