CopyVerify
フォルダ完全コピー & 全ファイル照合アプリ(macOS 用)
外付け HDD のフォルダを、中身もメタデータもまったく同じ状態で別の HDD へ。
コピーが終わったら、全ファイルを 1 バイト単位で照合して OK / NG を出します。
1 つでも壊れたら困るコピーのために。
CopyVerify が何をして、何をしないのか。8 つの特長を順に説明します。
コピーが「正しい」ことは別のこと。
写真や動画のバックアップのように、ファイル数が多い作業では、どこかで 1 ファイルだけ壊れていても気づけません。Finder でのコピーは「エラーが出なかった」ことしか教えてくれないからです。
CopyVerify は、外付け HDD などのフォルダを別の HDD へ中身もメタデータもまったく同じ状態でコピーし、そのあと全ファイルを 1 バイト単位でコピー元と比べます。結果は OK / NG で出るので、「たぶん大丈夫」ではなく「確認済み」で作業を終えられます。
コピー元とコピー先は、毎回選ぶ。
コピー元とコピー先は、実行のたびにフォルダ選択画面で指定します。アプリの中に固定のパスはありません。
- コピー元の [選択…] は、最初に /Volumes(外付けディスクの一覧)を開きます。
- コピー先には、コピー元と同じ名前のフォルダが作られます。作成先のパスは ② の下に表示されます。
- どちらかを選び直すと、前回の [実行確認] は無効になります。
中身もメタデータも、そのまま。
macOS 標準の ditto で、1 ファイルずつコピーします。ファイルの中身だけでなく、次の情報も保持します。
- 権限(アクセス権)
- 日付(作成日・変更日)
- 拡張属性(タグ・コメントなど)
- リソースフォーク
すべてのファイルをコピーし終えたら、最後にフォルダの権限・日付・拡張属性もコピー元にそろえます。
全ファイルを、1 バイト単位で照合。
コピーが終わると、1 ファイルずつ次の順に確かめます。前の段階で違いが見つかれば、その時点で NG です。
- 存在:コピー先にファイルがあるか
- サイズ:コピー元と同じ大きさか
- 中身:cmp -s で 1 バイトずつ比べて同じか
シンボリックリンクは、リンクそのものではなくリンク先を比べます。最後に、コピー先にだけあるファイルも探します。
消すのは、壊れたコピーだけ。
コピーエラー・停止・内容不一致・読み取りエラーになったファイルは、コピー先から自動で削除します。途中まで書かれた不完全なファイルも残しません。
だから NG が出ても、もう一度 [実行確認] → [実行] を押すだけで入れ直せます。壊れたファイルが「コピー済み」の顔をして残ることはありません。
1 つのエラーで、全体を止めない。
処理はどの段階も 1 ファイルずつ行います。あるファイルでエラーや停止が起きても、そのファイルだけを飛ばして次のファイルから続けます。
何千ファイルもあるコピーで、途中の 1 件のために最初からやり直す必要はありません。NG のファイルは一覧とログに残るので、あとからまとめて確認できます。
OS が勝手に作るファイルは、数えない。
Mac の .DS_Store と Windows の Thumbs.db は、コピーも照合もしません。どちらもフォルダを開くだけで作られたり書き換わったりするため、照合すると意味のない NG になるからです。
- 名前の大文字・小文字は区別しません(例:thumbs.DB も除外)。
- ファイル数・合計容量の集計からも外します。
- コピー先に前からある .DS_Store / Thumbs.db は削除しません。
いま、どこまで進んだか。
準備・コピー・照合のどの段階でも、1 ファイルごとに進行状況を表示します。画面は 0.1 秒ごとに更新されます。
- フォルダ番号 / 総数、ファイル番号 / 総数
- 処理中のファイル名とサイズ(バイト)
- 累計容量 / 合計容量と、その時点の NG 件数
- 段階ごとにかかった時間(右ペイン)
NG のときだけ、記録を残す。
NG が 1 件以上あったときだけ、デスクトップにログを保存します。全部 OK ならログは作らないので、デスクトップに不要なファイルが増えません。
画面のエラー一覧は先頭 1000 件までですが、ログには全件が残ります。終了時には Dock のアイコンが跳ねて知らせます。
コピーして、1 バイトずつ確かめる。
[実行] を押すと、準備 → コピー → 照合の順に自動で進みます。下で動きを体験できます。
待機中 — [実行] を押してください
エラー箇所 (フォルダ名/ファイル名) 0 件
※ 動作イメージのデモです。実際のファイル名・件数・時間は環境により異なります。
画面は、上から順に 5 つだけ。
幅 700 × 高さ 800 ピクセルの固定ウインドウ。上から下へ操作すれば迷いません。
- 1
コピー元15pt
コピーするフォルダのパスと [選択…] ボタン。最初は /Volumes(外付けディスク一覧)が開きます。
- 2
コピー先15pt / 作成先 14pt
保存場所を選ぶと、下に実際の作成先(コピー元と同じ名前のフォルダ)を表示。その下に [実行確認] ボタン。
- 3
コピー内容黒 30% 背景
左にファイル数・フォルダ数・合計容量・空き容量、右に開始・終了と段階ごとの時間。長いパスは中央を「…」で省略し、マウスを乗せると全文を表示します。
- 4
実行 / 中止
[実行] は実行確認が通ったときだけ押せます。[中止] は実行中だけ表示されます。
- 5
実行状況黒背景・白文字
見出し・進み具合バー・進行状況・結果・エラー一覧。エラー箇所は見つかった時点ですぐ追加表示します(画面は先頭 1000 件まで、全件はログへ)。
3コピー内容(左ペイン)
[実行確認] を押すと表示されます。「コピー先」の前には空白行が 1 行入ります。
| 項目 | 内容 |
|---|---|
| ファイル数 | .DS_Store と Thumbs.db を除いて数えます。 |
| フォルダ数 | サブフォルダの数です。コピー元フォルダ自体は含めません。 |
| 合計容量 | du で調べた容量(除外ファイル分を除く)。 |
| 空き容量 | df で調べたコピー先の空き。足りなければ赤字のエラーになります。 |
| 長いパス | 中央を「…」で省略。マウスを乗せると全文を表示します。 |
3時間(右ペイン)
| 項目 | 内容 |
|---|---|
| 開始時間 | [実行] を押した時刻。マウスを乗せると日付つきで表示。 |
| 終了時間 | 処理が終わった時刻。実行中は「—」、中止したときはオレンジ色。 |
| 準備 / コピー / 照合 | 各段階の時間(時:分:秒)。実行中の段階は 1 秒ごとに増え、未開始は「—」。 |
| 総時間 | [実行] から終了まで(太字)。3 段階の合計と必ず一致するよう計算します。 |
5実行状況
見出しは段階に合わせて「コピー準備中…」「コピー中…」「照合中…」「完了 — 照合 OK / NG あり」と変わります。エラー箇所は「フォルダ名/ファイル名」の形で、見つかった時点ですぐ追加されます(画面には先頭 1000 件まで。全件はログに保存)。NG ログを保存したときは「NG ログ: Desktop/CopyVerify_NG_….log」のように、ホームフォルダからの短い表記で場所を表示します。
使い方は、選んで、確認して、実行。
終わると Dock のアイコンが跳ねて知らせます。
- 起動するCopyVerify を開きます。
- コピー元を選ぶ① の 選択… でコピーするフォルダを選びます。
- コピー先を選ぶ② の 選択… で保存場所を選びます。中に同じ名前のフォルダが作られます。
- 実行確認を押す③ にファイル数・容量・空き容量が出ます。問題があれば赤字のエラーが出て、実行は押せません。
- 実行を押す準備 → コピー → 照合の順に自動で進みます。
- 結果を見る⑤ に OK 件数 / NG 件数。NG のファイルは削除済みなので、もう一度実行すれば入れ直せます。
処理は、1 ファイルずつ順番に。
[実行確認] から終了まで、各段階で何をしているか。
- 実行確認
ファイル数・フォルダ数を数え、du で容量、df で空き容量を調べて ③ に表示します。同時に、コピー元とコピー先の組み合わせに危険がないかを 8 項目でチェックします(下の「事故防止チェック」)。
表示③ に表示 - ① 準備
コピー元を 1 件ずつ調べ、コピー対象の一覧を作ります。.DS_Store / Thumbs.db はここで外します。
見出しコピー準備中… - ② コピー
コピー先にフォルダを作り、ditto <元> <先> で 1 ファイルずつコピーします。最後にフォルダの権限・日付・拡張属性をコピー元にそろえます。
見出しコピー中… - ③ 照合
1 ファイルずつ、存在 → サイズ → cmp -s で中身を比較します。シンボリックリンクはリンク先を比較します。
見出し照合中… - ④ 余分チェック
コピー先にだけあるファイルを探し、NG「コピー先のみ」として知らせます。前から保存していたデータの可能性があるため、削除はしません。
見出し照合中… - ⑤ 終了
エラーファイルをコピー先から削除し、⑤ に OK 件数 / NG 件数を表示します。NG があればログを保存し、Dock のアイコンが跳ねて終了を知らせます。
見出し完了 — 照合 OK / NG あり
消していいものだけを、消す。
削除のルールと、実行前の事故防止チェック。
削除のルール
削除するのは「コピー先のエラーファイル」だけです。
コピーエラー・停止・内容不一致・読み取りエラー(途中まで書かれた不完全なファイルも含む)削除する
前から保存していたデータの可能性があるため削除しない
中身ごと消える事故を防ぐため削除しない
- コピー先フォルダの中であること
- コピー元とその中身ではないこと
- フォルダではないこと
実行前の事故防止チェック
[実行確認] の時点で、危ない組み合わせを止めます。
コピー元は、どんな場合でも削除しません。
NG の理由が、ひと目でわかる。
7 種類の NG と、応答しないファイルの扱い。
コピーエラーditto がエラーで終わった
コピー先を削除停止(応答なし)決められた時間を過ぎても処理が終わらなかった
コピー先を削除内容不一致サイズまたは中身がコピー元と違う
コピー先を削除読み取りエラーファイルを読めなかった(cmp のエラーなど)
コピー先を削除コピー漏れコピー先にファイルが無い
消すものなしコピー先のみコピー先にだけファイルがある
削除しないフォルダ作成エラー / スキップフォルダを作れない、特殊ファイル(パイプ等)
—① SIGTERM時間を超えたら、まず普通に止める② SIGKILL5 秒たっても止まらなければ強制的に止める③ 次へそれでも止まらなくても待ち続けず、次のファイルへ進む④ 記録停止したファイルはコピー先から削除し、NG「停止(応答なし)」として記録■ 中止[中止] を押すと実行中の ditto / cmp を止めて終了。途中のファイルは不完全なので削除し、終了時間はオレンジ色で表示
細かいところも、決めてあります。
除外ファイル
- .DS_Store
- Mac の Finder がフォルダごとに作る表示設定ファイル
- Thumbs.db
- Windows がフォルダごとに作る縮小画像のキャッシュ
コピーも照合もしません。大文字・小文字は区別せず(例:thumbs.DB も除外)、ファイル数・合計容量の集計からも外します。
NG ログ
- 作成
- NG が 1 件以上のときだけ
- 保存場所
- デスクトップ(書けない場合は一時フォルダ)
- 中身
- NG の行だけ(種類・フルパス・理由・削除の結果)
動作環境
- バージョン
- 2.0
- OS
- macOS 13 Ventura 以降
- CPU
- Apple シリコン(M1 以降)/ Intel(インストール時に自動判別)
- 必要
- Xcode コマンドラインツール(インストール時のみ。無ければ案内が出ます)
- 使用
- ditto / cmp / du / df
主な設定値(ソースコードで変更可能)
CopyVerify.swift の次の箇所を書き換えて再インストールすると、動作を調整できます。
| 設定 | 現在の値 | 場所(CopyVerify.swift) |
|---|---|---|
| ウインドウサイズ | 700 × 800 px | .frame(width: 700, height: 800) |
| 除外ファイル | .DS_Store, Thumbs.db | excludedNames |
| 停止とみなす最短時間 | 120 秒 | minTimeout |
| 想定する最低速度 | 2MB/秒 | minBytesPerSecond |
| 画面の更新間隔 | 0.1 秒 | startUITimer() |
| エラー一覧の表示上限 | 1000 件 | ngLines.prefix(1000) |
| 右ペイン(時間)の幅 | 210 px | timePane .frame(width: 210) |
あなたの Mac で、組み立てて入れる。
インストーラーがソースコードをその Mac 上でコンパイルするので、Gatekeeper の「開いていません」警告が出ません。
bash ~/Downloads/install_CopyVerify.sh- macOS を確認13 未満なら中止します。
- ツールを確認Xcode コマンドラインツールが無ければ、インストール画面を開いて終了します。
- コンパイルソースコードを一時フォルダに書き出し、この Mac の CPU 向けにコンパイルします。
- アプリを組み立てるCopyVerify.app(Info.plist + 実行ファイル)を作り、アドホック署名します。
- 配置/Applications に配置(書けなければ ~/Applications)。旧版は置き換えます。
- 起動そのままアプリが起動します。
使う前に、知っておいてほしいこと。
- 1 ファイルずつ処理を起動するため、数万件の小さなファイルでは、フォルダ全体を一度にコピーする方式より時間がかかることがあります。
- コピー先に同名フォルダがあると、中身は上書きされます。コピー先にだけあるファイルは削除せず、NG「コピー先のみ」として知らせます。
- 照合は 1 バイト単位の比較のため、コピーとほぼ同じだけの時間がかかります。
- ファイル名に改行を含むなど特殊なファイルは、正しく扱えない場合があります。
- 管理者が設定した Mac(会社の PC など)では、インストールや実行が制限されることがあります。
バックアップを、
「たぶん大丈夫」から「確認済み」へ。
CopyVerify 2.0 ・ macOS 13 Ventura 以降 ・ Apple シリコン / Intel
ダウンロードした時点で、利用規約に同意したものとみなします。
免責事項
Chrome の拡張機能を利用する場合、導入・設定・動作確認・運用に伴う責任はすべて利用者自身にあります。拡張機能の使用によって発生した不具合、データ損失、表示崩れ、業務影響、第三者とのトラブル等について、提供側は責任を負いません。利用前に必ず内容を確認し、ご自身の判断と責任のもとでご利用ください。
提供者の故意または重大な過失による損害、その他法令により責任の免除・制限が認められない場合には、この免責は適用しません。損害賠償責任の有無と範囲は適用法令に従います。
共通利用規約の責任に関する条項