05月30日
TimeMachineの保存先のキャッシュはどこだ?(コマンドで探してみる)
前回(未解決:サーバーへ接続するアドレスを変更後に、元のアドレスで警告が出ます)の続きです。
未だに解決できていません。今回はシェルの話です。
まずは、どこにplistが格納されているのかをmanから調査します。
launchd.plistの説明から、manを見てみる気になりました。
man launchd.plistで確認すると
FILESセクションに5つのフォルダが明記されていました。
~/Library/LaunchAgents 、/Library/LaunchAgents、
/Library/LaunchDaemons /System/Library/LaunchAgents
/System/Library/LaunchDaemons
未だに解決できていません。今回はシェルの話です。
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できるようです。
しかし、この"パス"となったリストをある程度大量に渡すと、ところどころちょん切れる問題が発生します。
上記検証を踏まえ、
なるべく手間がかからなくて、単純にいける方法はないかと、考えます。
1フェーズ目で、grep用のコマンドリストを作成、2フェーズ目でコマンドリストを実行し、結果を検索するという方式にします。
(見やすくする為に改行しています。実際は改行してはいけません)
使っているコマンドの説明
フェーズ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を除外する目的です。
このフェーズ1、2を各フォルダ毎に繰り返しました。
残念ながら、新しい発見はありませんでした。orz
defaults readと同等のようです。
すべての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と同等のようです。
コメントシステムを利用したくない方はお問い合わせからお願いします。
2013.8.19 DISQUS(外部コメントサービス)の利用を開始しました。
Facebook, google, Twitter等のアカウントで投稿可能です。