compare folders mac xで道具ごとに結果が食い違う理由
同じ2つのフォルダを別々の道具で比べると、結果が一致しないことがよくあります。片方は「同一」と言い、もう片方は差分を40件並べ、3つ目は画面上どちらにもあるはずの項目を「片側にしか無い」と報告する。どれも壊れているわけではありません。見ている対象が違うだけです。加えて、macOS自身がフォルダの中に作るファイルがあり、それを数える道具と無視する道具が混在しています。必要なのは、どの道具が良いかを決めることではなく、それぞれが何を見て何を見ていないのかを知ることです。
比較の道具は、買う前に手元に揃っている
macOSでフォルダを比べるだけなら、追加で買うものはありません。標準の状態で使えるものが6つあり、それぞれに見えていない領域があります。
| 道具 | 分かること | 見ていないもの |
|---|---|---|
diff -rq A B |
中身の違うファイルと、片側にしか無いファイル | アクセス権、拡張属性 |
cmp -s a b |
2つのファイルが1バイトまで同じかどうか | フォルダ構造 |
rsync -avn A/ B/ |
同期したら何が動くか(サイズと更新日時で判定) | サイズと日時が変わらない書き換え |
rsync -avnc A/ B/ |
同じ判定を、中身の要約値で行った結果 | 転送対象に指定していない情報 |
shasum で作る一覧 |
後日また比べられる記録 | 一覧同士を比べない限り、片側にしか無い名前 |
opendiff |
2つの階層を左右に並べた画面 | Xcodeが入っていないと起動しない |
補足が要るものが2つあります。opendiff は /usr/bin に置かれた小さな橋渡しで、実体はXcodeの中にあるFileMergeです。Xcodeが入っていない環境では、コマンドはあるのに何も開きません。
もう1つは rsync です。現在のmacOSで /usr/bin/rsync にあるのはopenrsyncで、man rsync を開くと見出しはOPENRSYNCになっています。rsync 2.6.9相当という表示が出るため、後年に追加されたオプションを前提にした解説をそのまま持ち込むと動きが変わります。古い記事の指定を写す前に、そのMacの man rsync を1回開くほうが早く済みます。
diff も同様です。macOSのものはFreeBSD由来だとコマンド自身が名乗っており、解説記事が前提にしているGNU版とは別物です。-r、-q、-x、-X は揃っているので通常の用途で困ることはありませんが、GNUの資料から珍しい指定を持ってきたときだけ手元で確認してください。出力の言い回しは決まっていて、中身が違えば Files A/x and B/x differ、片側にしか無ければ Only in A: x と出ます。画像などのバイナリでも同じ1行にまとまるため、書類と画像が混ざった階層でも扱いを分けずに済みます。
道具ごとに扱いが分かれる要素も2つあります。1つはシンボリックリンクです。パスを書いた小さなファイルとして数える道具と、リンクの先まで追いかける道具があり、階層の外を指すリンクが混ざっていると報告がまったく変わります。もう1つは中身の無いフォルダです。差分として並べる道具と、ファイルだけを見る道具があるため、片側にだけある空のフォルダは出たり出なかったりします。どちらも正誤の問題ではないので、本番の素材に当てる前に小さな組で1度確かめておくと、あとで結果を疑わずに済みます。
macOSがフォルダに置いていく、自分のものではないファイル
Finderで一度でも開いたフォルダには、.DS_Store というファイルができます。アイコンの位置、並び順、ウインドウの大きさなど、そのフォルダの表示設定を覚えておくためのものです。Finderからは見えず、フォルダを走査する道具からははっきり見えます。中身がまったく同じ2つのフォルダでも、両方をFinderで開いた時点でこのファイルが食い違うため、素朴に比較するとほぼ全てのフォルダに差分が出ます。
Appleの資料は、ネットワーク共有での読み込みが遅くなる文脈でこのファイルに触れています。
SMB のファイルブラウジングを高速化するには、macOS が SMB 共有上の「.DS_Store」ファイルを読み取らないように阻止できます。そうすれば、Finder で基本情報だけを使って、各フォルダの中身がすぐにアルファベット順で表示されるようになります。 出典: support.apple.com
同じ種類のものは他にもあります。
- Mac固有の情報をそのまま保存できないボリューム、たとえばexFATのUSBメモリや多くのネットワーク共有では、拡張属性が
._で始まる別ファイルに書き出されます - 取り外し可能なボリュームの直下には
.Spotlight-V100、.fseventsd、.Trashesが作られます - 書庫を展開したフォルダには、作成元の環境が残した管理用のファイルが混ざっていることがあります
いずれも比較したい素材ではありません。除外しない限り、全て差分として報告されます。除外の指定は使い回せる形にしておくのが得策です。diff は1つの条件なら -x、複数条件をファイルから読ませるなら -X ファイル名 を受け付けます。rsync では --exclude が同じ役目です。1回作っておけば、以降の比較から偽の差分がほぼ消えます。
画面では同じに見える名前と、共存できない名前
食い違いのもう1つの原因は、画面に出ている名前とディスク上の名前が同じものではない点にあります。
濁点や半濁点を含む日本語の名前は、2通りの書き方ができます。1文字として保存する形と、元の文字と記号を分けて保存する形です。表示はどちらも同じです。APFSはこの2つを同じ名前として扱うため、片方の形で作ったあとにもう片方の形で作っても、フォルダに残るのは1つです。分解された形は珍しいものではなく、他のOSで作られた書庫、HFS Plus時代から持ち越したデータ、一部のダウンロードから日常的に入ってきます。
この形の違いは、フォルダの中を並べ替えたときにも顔を出します。分解された形の名前は、結合された形の名前と違う位置に並ぶことがあり、一覧の途中で同じ名前が二度出てきたように見えます。名前で突き合わせる作業をしているときに、目視では見つけられない食い違いが起きるのはこのためです。書庫から展開したフォルダを扱うときは、名前の比較に入る前に、両方の形が混ざっていないかを疑う価値があります。
比較の観点では、これが両方向に効きます。ディレクトリの一覧を文字列として比べる道具は、ファイルシステムが同じと見なす名前を「違う」と報告します。ファイルシステムに問い合わせる道具は「同じ」と報告します。どちらの答えにも根拠があるため、同じフォルダの組でもアプリを変えると結果が変わります。
大文字と小文字も似ていますが、結果はもっと厳しくなります。標準のボリュームは Notes.txt と notes.txt を区別しません。区別するボリュームや書庫の中で両方が存在していたフォルダは、Macの上では再現できません。比較の結果は1件にまとまり、その前段のコピーですでに片方が失われています。
どの比較にも出てこない情報
diff が比べているのは中身です。同じだと判定された2つのファイルが、Macの上で違う振る舞いをすることがあります。ファイルの外側に情報が付いているからです。
拡張属性には、Finderのタグやコメント、ダウンロードした項目に付く隔離の印が入っています。付いているかどうかは ls -l@ で分かり、中身は xattr -l で読めます。cp や ditto のコピーでは引き継がれますが、ターミナルの zip と unzip で往復すると落ちます。書庫から復元したフォルダが全ファイル一致でありながらタグを全て失っている、という状態はここから生まれます。
アクセス権と所有者も同じ分類です。中身が同じでも、権限が引き継がれていなければ目的には使えません。ls -le で見えるアクセス制御リストまで含めると、通常の比較が触れていない層はさらに増えます。
ここで必要なのは道具ではなく手順です。比較を始める前に、知りたいのが中身だけなのか、システムから見たファイルとして同じかどうかなのかを決めます。後者なら、階層全体の報告に頼らず、候補になった2つのファイルに対して xattr -l を直接実行するのがいちばん確実です。
有料の道具が仕事をする場面
ここまでの道具は、問いに答えるものです。大きな2つの階層を眺めて、300件の差分をどう処理するかを決める作業には向いていません。そこは画面を持つ道具の領分で、同期の画面を備えた2画面のファイル管理アプリが当てはまります。
価格は買い切りのものが多く、ForkLift 4は19.95米ドル、Commander One PROは29.99米ドルです。Transmit 5は45米ドルで、こちらは比較ではなく転送のためのアプリなので、比べたいフォルダがサーバー上にある場合に関係してきます。Cyberduckは開発元のサイトからは無料で入手でき、Mac App Storeでは4,000円の有料アプリとして並んでいます。同じソフトの2通りの入手経路であり、別の製品ではありません。
画面を持つ道具を選ぶときは、価格より先に、どの階層まで比べるのかを確認してください。名前と大きさだけを突き合わせる作りのものと、中身まで読むものがあり、同じ「フォルダの比較」という言葉で呼ばれています。前者は速い代わりに、大きさが変わらない書き換えを見落とします。後者は確実な代わりに、写真や動画の入った階層では時間がかかります。体験版が用意されている製品であれば、手元の実際のフォルダで1度動かしてから決めるのが確実です。
試用の条件も製品ごとに違います。Path Finderは30日の試用が用意されているので、手元の実際の階層に当ててから判断できます。試用期間があるうちに確かめておきたいのは、機能の一覧ではなく、自分がいつも比べているフォルダで結果が返るまでの時間です。
遠隔のフォルダを比べる計画を立てる前に、macOS側の変更を1つ知っておく必要があります。macOSには ftp コマンドがすでにありません。FTPのサーバーと手元を比べるなら、ボリュームとして接続するか、その通信に対応したアプリを使うことになります。それ以前に書かれた記事は、存在しないコマンドを前提にしています。
道具ではなく問いから選ぶ
実際の比較は、だいたい3つの型に収まります。コピーが正しく終わったかを知りたいなら、必要なのは中身の要約値による判定で、速度は二の次です。どちらが新しい作業を含んでいるかを知りたいなら、更新日時が正しい手がかりで、要約値の計算は無駄になります。書類の中で何が変わったかを知りたいなら、差分を中身まで表示できる画面の道具に移る価値があります。
4つ目の型は、比較そのものではなく作業の流れの問題です。1回比べて終わりなら作業です。比べて、差分を開いて、コマンドを流して、項目を左右に移す、という往復が続くなら、それは複数のアプリをまたぐ回路になります。フォルダとターミナルとAIが同じ窓にある形の道具は、この往復を減らすために作られています。設計の違いは他のファイル管理との比較で並べてあり、実際に何ができるのかはできることにまとまっています。判断は機能の数ではなく、1日の往復が何回減るかで見たほうが外しません。
よくある質問
作った覚えのないファイルが毎回差分として出てきます。何ですか?
ほとんどの場合 .DS_Store です。Finderがフォルダを表示するときに、アイコンの位置や並び順を覚えるために書き込みます。外付けやネットワークのボリュームでは ._ で始まるファイルや .Spotlight-V100 も同じ理由で現れます。diff -x や除外リストで外せば、本当の差分だけが残ります。
macOSのrsyncは、解説記事に出てくるrsyncと同じものですか?
違います。現在のmacOSの /usr/bin/rsync はopenrsyncで、マニュアルの見出しもOPENRSYNCになっています。rsync 2.6.9相当と表示されるため、後から追加されたオプションは動きが違うか、存在しない場合があります。古い指定を写す前に man rsync を確認してください。
FileMergeを使うにはXcodeが必要ですか?
必要です。/usr/bin/opendiff はFileMergeを呼び出すための橋渡しで、FileMerge本体はXcodeのアプリケーションの中にあります。Xcodeが入っていない環境ではコマンドは存在するのに何も開かないため、無反応に見えます。
画面では同じ名前に見えるのに、道具によって扱いが違います。原因は何ですか?
濁点などの文字が、結合した形と分解した形という2通りの保存のされ方をしているためです。表示は同じになります。APFSは両方を同じ名前として扱うので共存できませんが、文字列として比べる道具は別の名前と判断します。分解された形は書庫や古いデータから入ってくることが多いです。