XITSW

CopyVerify

フォルダ完全コピー & 全ファイル照合アプリ(macOS 用)

外付け HDD のフォルダを、中身もメタデータもまったく同じ状態で別の HDD へ。
コピーが終わったら、全ファイルを 1 バイト単位で照合して OK / NG を出します。

●macOS 13 Ventura 以降 ●Apple シリコン / Intel ●ditto でコピー・cmp で照合 ●コピー元は絶対に削除しない

1 つでも壊れたら困るコピーのために。

CopyVerify が何をして、何をしないのか。8 つの特長を順に説明します。

コピーが「終わった」ことと、
コピーが「正しい」ことは別のこと。

写真や動画のバックアップのように、ファイル数が多い作業では、どこかで 1 ファイルだけ壊れていても気づけません。Finder でのコピーは「エラーが出なかった」ことしか教えてくれないからです。

CopyVerify は、外付け HDD などのフォルダを別の HDD へ中身もメタデータもまったく同じ状態でコピーし、そのあと全ファイルを 1 バイト単位でコピー元と比べます。結果は OK / NG で出るので、「たぶん大丈夫」ではなく「確認済み」で作業を終えられます。

01 · Select every time

コピー元とコピー先は、毎回選ぶ。

コピー元とコピー先は、実行のたびにフォルダ選択画面で指定します。アプリの中に固定のパスはありません。

  • コピー元の [選択…] は、最初に /Volumes(外付けディスクの一覧)を開きます。
  • コピー先には、コピー元と同じ名前のフォルダが作られます。作成先のパスは ② の下に表示されます。
  • どちらかを選び直すと、前回の [実行確認] は無効になります。
コピー元 : /Volumes/data/Moto_GP コピー先 : /Volumes/data1 作成先 → /Volumes/data1/Moto_GP
02 · Copy with ditto

中身もメタデータも、そのまま。

macOS 標準の ditto で、1 ファイルずつコピーします。ファイルの中身だけでなく、次の情報も保持します。

  • 権限(アクセス権)
  • 日付(作成日・変更日)
  • 拡張属性(タグ・コメントなど)
  • リソースフォーク

すべてのファイルをコピーし終えたら、最後にフォルダの権限・日付・拡張属性もコピー元にそろえます。

# 1 ファイルごとに実行 ditto <コピー元のファイル> <コピー先のファイル>
03 · Verify with cmp

全ファイルを、1 バイト単位で照合。

コピーが終わると、1 ファイルずつ次の順に確かめます。前の段階で違いが見つかれば、その時点で NG です。

  • 存在:コピー先にファイルがあるか
  • サイズ:コピー元と同じ大きさか
  • 中身:cmp -s で 1 バイトずつ比べて同じか

シンボリックリンクは、リンクそのものではなくリンク先を比べます。最後に、コピー先にだけあるファイルも探します。

照合中… OK Moto_GP/2026/race01.mp4 OK Moto_GP/2026/race02.mp4 NG [内容不一致] Moto_GP/2026/race03.mp4 → 削除済み
04 · Safe delete

消すのは、壊れたコピーだけ。

コピーエラー・停止・内容不一致・読み取りエラーになったファイルは、コピー先から自動で削除します。途中まで書かれた不完全なファイルも残しません。

だから NG が出ても、もう一度 [実行確認] → [実行] を押すだけで入れ直せます。壊れたファイルが「コピー済み」の顔をして残ることはありません。

削除する コピー先のエラーファイル 削除しない コピー元のファイル(絶対に) 削除しない コピー先にだけあるファイル 削除しない フォルダ
05 · Keep going

1 つのエラーで、全体を止めない。

処理はどの段階も 1 ファイルずつ行います。あるファイルでエラーや停止が起きても、そのファイルだけを飛ばして次のファイルから続けます。

何千ファイルもあるコピーで、途中の 1 件のために最初からやり直す必要はありません。NG のファイルは一覧とログに残るので、あとからまとめて確認できます。

… race06.mp4 OK … race07.mp4 NG [停止(応答なし)] → 削除済み … race08.mp4 OK ← そのまま続行
06 · Exclude

OS が勝手に作るファイルは、数えない。

Mac の .DS_Store と Windows の Thumbs.db は、コピーも照合もしません。どちらもフォルダを開くだけで作られたり書き換わったりするため、照合すると意味のない NG になるからです。

  • 名前の大文字・小文字は区別しません(例:thumbs.DB も除外)。
  • ファイル数・合計容量の集計からも外します。
  • コピー先に前からある .DS_Store / Thumbs.db は削除しません。
07 · Progress

いま、どこまで進んだか。

準備・コピー・照合のどの段階でも、1 ファイルごとに進行状況を表示します。画面は 0.1 秒ごとに更新されます。

  • フォルダ番号 / 総数、ファイル番号 / 総数
  • 処理中のファイル名とサイズ(バイト)
  • 累計容量 / 合計容量と、その時点の NG 件数
  • 段階ごとにかかった時間(右ペイン)
コピー中… フォルダ 2 / 3 ファイル 1520 / 3282 IMG_0012.jpg 467,431 バイト 累計 3.1 GB / 約 6.9G NG 2 件
08 · NG log

NG のときだけ、記録を残す。

NG が 1 件以上あったときだけ、デスクトップにログを保存します。全部 OK ならログは作らないので、デスクトップに不要なファイルが増えません。

画面のエラー一覧は先頭 1000 件までですが、ログには全件が残ります。終了時には Dock のアイコンが跳ねて知らせます。

Desktop/CopyVerify_NG_Moto_GP_20261013_065602.log NG [内容不一致] /Volumes/data/Moto_GP/2026/race03.mp4 — 中身が一致しません → コピー先から削除しました

コピーして、1 バイトずつ確かめる。

[実行] を押すと、準備 → コピー → 照合の順に自動で進みます。下で動きを体験できます。

① 準備—
② コピー—
③ 照合—
④ 余分チェック—
⑤ 終了—

待機中 — [実行] を押してください

フォルダ – / 3 ファイル – / 24
累計 0 MB / 約 6.9G NG 0 件

※ 動作イメージのデモです。実際のファイル名・件数・時間は環境により異なります。

------ 時間 ------
開始時間—
終了時間—

準備—
コピー—
照合—

総時間—

画面は、上から順に 5 つだけ。

幅 700 × 高さ 800 ピクセルの固定ウインドウ。上から下へ操作すれば迷いません。

CopyVerify の画面構成
  • 1

    コピー元15pt

    コピーするフォルダのパスと [選択…] ボタン。最初は /Volumes(外付けディスク一覧)が開きます。

  • 2

    コピー先15pt / 作成先 14pt

    保存場所を選ぶと、下に実際の作成先(コピー元と同じ名前のフォルダ)を表示。その下に [実行確認] ボタン。

  • 3

    コピー内容黒 30% 背景

    左にファイル数・フォルダ数・合計容量・空き容量、右に開始・終了と段階ごとの時間。長いパスは中央を「…」で省略し、マウスを乗せると全文を表示します。

  • 4

    実行 / 中止

    [実行] は実行確認が通ったときだけ押せます。[中止] は実行中だけ表示されます。

  • 5

    実行状況黒背景・白文字

    見出し・進み具合バー・進行状況・結果・エラー一覧。エラー箇所は見つかった時点ですぐ追加表示します(画面は先頭 1000 件まで、全件はログへ)。

3コピー内容(左ペイン)

---------- コピー内容 ---------- コピー元 : /Volumes/data/backup/Mac写真-書き出し ファイル数: 3282 個 フォルダ数: 3 個 (サブフォルダ) 合計容量 : 6.9G (7283616 KB) コピー先 : /Volumes/data1/Mac写真-書き出し 空き容量 : 3.6Ti (3902486980 KB) --------------------------------

[実行確認] を押すと表示されます。「コピー先」の前には空白行が 1 行入ります。

項目内容
ファイル数.DS_Store と Thumbs.db を除いて数えます。
フォルダ数サブフォルダの数です。コピー元フォルダ自体は含めません。
合計容量du で調べた容量(除外ファイル分を除く)。
空き容量df で調べたコピー先の空き。足りなければ赤字のエラーになります。
長いパス中央を「…」で省略。マウスを乗せると全文を表示します。

3時間(右ペイン)

------ 時間 ------ 開始時間: 07:53:12 終了時間: 08:04:57 ───────────── 準備 : 00:00:12 コピー : 00:07:28 照合 : 00:03:05 ───────────── 総時間 : 00:10:45
項目内容
開始時間[実行] を押した時刻。マウスを乗せると日付つきで表示。
終了時間処理が終わった時刻。実行中は「—」、中止したときはオレンジ色。
準備 / コピー / 照合各段階の時間(時:分:秒)。実行中の段階は 1 秒ごとに増え、未開始は「—」。
総時間[実行] から終了まで(太字)。3 段階の合計と必ず一致するよう計算します。

5実行状況

コピー中… フォルダ 2 / 3 ファイル 1520 / 3282 IMG_0012.jpg 467,431 バイト 累計 3.1 GB / 約 6.9G NG 2 件 ──────────────────────────────────────────── エラー箇所 (フォルダ名/ファイル名) 2 件 NG [内容不一致] Moto_GP/2026/race03.mp4 → 削除済み NG [停止(応答なし)] Moto_GP/2026/race07.mp4 → 削除済み

見出しは段階に合わせて「コピー準備中…」「コピー中…」「照合中…」「完了 — 照合 OK / NG あり」と変わります。エラー箇所は「フォルダ名/ファイル名」の形で、見つかった時点ですぐ追加されます(画面には先頭 1000 件まで。全件はログに保存)。NG ログを保存したときは「NG ログ: Desktop/CopyVerify_NG_….log」のように、ホームフォルダからの短い表記で場所を表示します。

使い方は、選んで、確認して、実行。

終わると Dock のアイコンが跳ねて知らせます。

  1. 起動するCopyVerify を開きます。
  2. コピー元を選ぶ① の 選択… でコピーするフォルダを選びます。
  3. コピー先を選ぶ② の 選択… で保存場所を選びます。中に同じ名前のフォルダが作られます。
  4. 実行確認を押す③ にファイル数・容量・空き容量が出ます。問題があれば赤字のエラーが出て、実行は押せません。
  5. 実行を押す準備 → コピー → 照合の順に自動で進みます。
  6. 結果を見る⑤ に OK 件数 / NG 件数。NG のファイルは削除済みなので、もう一度実行すれば入れ直せます。
コピー元かコピー先を選び直すと、前回の実行確認は無効になります。もう一度 [実行確認] を押してください。実行中にアプリを閉じようとすると確認が出ます。

処理は、1 ファイルずつ順番に。

[実行確認] から終了まで、各段階で何をしているか。

  1. 実行確認

    ファイル数・フォルダ数を数え、du で容量、df で空き容量を調べて ③ に表示します。同時に、コピー元とコピー先の組み合わせに危険がないかを 8 項目でチェックします(下の「事故防止チェック」)。

    表示③ に表示
  2. ① 準備

    コピー元を 1 件ずつ調べ、コピー対象の一覧を作ります。.DS_Store / Thumbs.db はここで外します。

    見出しコピー準備中…
  3. ② コピー

    コピー先にフォルダを作り、ditto <元> <先> で 1 ファイルずつコピーします。最後にフォルダの権限・日付・拡張属性をコピー元にそろえます。

    見出しコピー中…
  4. ③ 照合

    1 ファイルずつ、存在 → サイズ → cmp -s で中身を比較します。シンボリックリンクはリンク先を比較します。

    見出し照合中…
  5. ④ 余分チェック

    コピー先にだけあるファイルを探し、NG「コピー先のみ」として知らせます。前から保存していたデータの可能性があるため、削除はしません。

    見出し照合中…
  6. ⑤ 終了

    エラーファイルをコピー先から削除し、⑤ に OK 件数 / NG 件数を表示します。NG があればログを保存し、Dock のアイコンが跳ねて終了を知らせます。

    見出し完了 — 照合 OK / NG あり
1 ファイルずつ処理するので、あるファイルで問題が起きても、そのファイルだけを飛ばして次へ進めます。その代わり、数万件の小さなファイルでは、フォルダ全体を一度にコピーする方式より時間がかかることがあります。

消していいものだけを、消す。

削除のルールと、実行前の事故防止チェック。

削除のルール

削除するのは「コピー先のエラーファイル」だけです。

コピー先のエラーファイル
コピーエラー・停止・内容不一致・読み取りエラー(途中まで書かれた不完全なファイルも含む)
削除する
コピー元のファイル絶対に削除しない
コピー先にだけあるファイル
前から保存していたデータの可能性があるため
削除しない
コピー先に前からある .DS_Store / Thumbs.db削除しない
フォルダ
中身ごと消える事故を防ぐため
削除しない
削除の前に、毎回 3 つを確認
  1. コピー先フォルダの中であること
  2. コピー元とその中身ではないこと
  3. フォルダではないこと
どれかに当てはまると削除しません。

実行前の事故防止チェック

[実行確認] の時点で、危ない組み合わせを止めます。

コピー元・コピー先の両方が選ばれているか未選択ならエラー
コピー元が存在するか無ければエラー
コピー先の保存場所が存在するか(HDD 未接続の検出)無ければエラー
コピー元とコピー先が同じではないか同じならエラー
コピー先がコピー元の中にないか中にあればエラー
コピー元がコピー先の中にないか(コピー元を壊す危険)中にあればエラー
空き容量が足りるか足りなければエラー
コピー先に同名フォルダが既にあるか注意を表示(上書き)

コピー元は、どんな場合でも削除しません。

NG の理由が、ひと目でわかる。

7 種類の NG と、応答しないファイルの扱い。

コピーエラー

ditto がエラーで終わった

コピー先を削除
停止(応答なし)

決められた時間を過ぎても処理が終わらなかった

コピー先を削除
内容不一致

サイズまたは中身がコピー元と違う

コピー先を削除
読み取りエラー

ファイルを読めなかった(cmp のエラーなど)

コピー先を削除
コピー漏れ

コピー先にファイルが無い

消すものなし
コピー先のみ

コピー先にだけファイルがある

削除しない
フォルダ作成エラー / スキップ

フォルダを作れない、特殊ファイル(パイプ等)

—
「停止(応答なし)」とみなす時間
待ち時間 = 120 秒 + ファイルサイズ ÷ 2MB/秒
632 秒約 10 分 32 秒
  1. ① SIGTERM時間を超えたら、まず普通に止める
  2. ② SIGKILL5 秒たっても止まらなければ強制的に止める
  3. ③ 次へそれでも止まらなくても待ち続けず、次のファイルへ進む
  4. ④ 記録停止したファイルはコピー先から削除し、NG「停止(応答なし)」として記録
  5. ■ 中止[中止] を押すと実行中の ditto / cmp を止めて終了。途中のファイルは不完全なので削除し、終了時間はオレンジ色で表示

細かいところも、決めてあります。

除外ファイル

.DS_Store
Mac の Finder がフォルダごとに作る表示設定ファイル
Thumbs.db
Windows がフォルダごとに作る縮小画像のキャッシュ

コピーも照合もしません。大文字・小文字は区別せず(例:thumbs.DB も除外)、ファイル数・合計容量の集計からも外します。

NG ログ

作成
NG が 1 件以上のときだけ
保存場所
デスクトップ(書けない場合は一時フォルダ)
中身
NG の行だけ(種類・フルパス・理由・削除の結果)
CopyVerify_NG_<コピー元フォルダ名>_<年月日>_<時分秒>.log NG [コピー先のみ] /Volumes/data1/Moto_GP/memo.txt — コピー元にありません(削除しません)

動作環境

バージョン
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.dbexcludedNames
停止とみなす最短時間120 秒minTimeout
想定する最低速度2MB/秒minBytesPerSecond
画面の更新間隔0.1 秒startUITimer()
エラー一覧の表示上限1000 件ngLines.prefix(1000)
右ペイン(時間)の幅210 pxtimePane .frame(width: 210)

あなたの Mac で、組み立てて入れる。

インストーラーがソースコードをその Mac 上でコンパイルするので、Gatekeeper の「開いていません」警告が出ません。

bash ~/Downloads/install_CopyVerify.sh
  1. macOS を確認13 未満なら中止します。
  2. ツールを確認Xcode コマンドラインツールが無ければ、インストール画面を開いて終了します。
  3. コンパイルソースコードを一時フォルダに書き出し、この Mac の CPU 向けにコンパイルします。
  4. アプリを組み立てるCopyVerify.app(Info.plist + 実行ファイル)を作り、アドホック署名します。
  5. 配置/Applications に配置(書けなければ ~/Applications)。旧版は置き換えます。
  6. 起動そのままアプリが起動します。
ダウンロードした .app を直接開いて警告が出た場合は、ターミナルで xattr -cr /Applications/CopyVerify.app を実行するか、システム設定 → プライバシーとセキュリティ →「このまま開く」で許可してください。

使う前に、知っておいてほしいこと。

  • 1 ファイルずつ処理を起動するため、数万件の小さなファイルでは、フォルダ全体を一度にコピーする方式より時間がかかることがあります。
  • コピー先に同名フォルダがあると、中身は上書きされます。コピー先にだけあるファイルは削除せず、NG「コピー先のみ」として知らせます。
  • 照合は 1 バイト単位の比較のため、コピーとほぼ同じだけの時間がかかります。
  • ファイル名に改行を含むなど特殊なファイルは、正しく扱えない場合があります。
  • 管理者が設定した Mac(会社の PC など)では、インストールや実行が制限されることがあります。

バックアップを、
「たぶん大丈夫」から「確認済み」へ。

CopyVerify 2.0 ・ macOS 13 Ventura 以降 ・ Apple シリコン / Intel

ダウンロードした時点で、利用規約に同意したものとみなします。