pc 重複ファイル 削除 無料|消す前に判定を確かめる手順

pc 重複ファイル 削除 無料で検索するとき、多くの場合は空き容量が足りていて、しかも道具にお金をかける前提がありません。無料のスキャナ自体はいくらでも見つかります。問題はその先で、数千行のファイルパスが並んだ一覧が出てきて、そのうちどれを消すかを決める場面です。

その判断は、思っているほどやり直しがききません。この記事では、スキャナが「重複」と呼んでいるものが実際には何を指しているのか、画面に出る削減見込みがなぜ実際の空きと合わないことがあるのか、そして一覧を「後から説明できる削除」に変える手順を扱います。

無料の線引きは、探す段ではなく消す段にある

無料の重複ファイル検索は、いくつかの型に分かれます。どこまでが無料なのかは、型を見れば先に分かります。

  • スキャンは無料で、削除の実行だけが有料。一覧が出た直後に購入画面が開く型
  • 削除できる件数や合計サイズに上限がある型。上限はスキャンが終わるまで表示されないことがある
  • オープンソースで本当に無料。制限は機能ではなく画面側にあり、プレビューや確認の手順が少ない
  • スキャン部分は無料で、実際に消す作業は月額の別アプリが受け持つ型

どの型であっても、規約と制限はスキャンを走らせる前に読んでおく価値があります。4,000行の一覧が出てから料金ページを読むのは、判断としては最悪のタイミングです。作業を終わらせたい気持ちが強い状態で、権限の話を読むことになるからです。

道具を比べるときは、機能一覧より料金ページのほうが速く読めます。どの操作に制限がかかるかが正面から書いてあるためです。ファイル管理の道具についても事情は同じで、料金のページは何が無料で何がそうでないかを短く確かめる場所になります。

重複と呼ばれているものは、4つの違う判定の結果

スキャナは、どの判定を使ったかをあまり明示しません。よく使われる4つは、実際にはかなり結果が食い違います。

名前の一致は「資料.pdf」と「資料のコピー.pdf」を見つけます。速い代わりに、外れることが多い判定です。同じ名前で中身が違うファイルは、同じ雛形から2回書類を作ればすぐに生まれます。

サイズの一致はバイト数を比べます。誤検出がまとまって出ます。同じカメラの同じ設定で撮った写真や、同じ雛形から書き出したPDFは、バイト数がそろうことがあります。

ハッシュの一致は全バイトを読んで固定長の値を作ります。SHA-256の値が同じなら中身は同じです。信用できる判定であり、同時にいちばん遅い判定でもあります。ファイル全体をディスクから読む必要があるためです。

1バイトずつの比較は2つのファイルを読み、最初に違ったところで止まります。ハッシュと同じことを証明しますが、あとで再利用できる値は残りません。

速いスキャナは、名前とサイズで候補を絞ってからハッシュをかけます。設計としては妥当です。困るのは、名前一致の行とハッシュ一致の行が同じ一覧に混ざり、行頭のチェックボックスも同じ見た目で並ぶときです。どの判定でその行が出たのかを説明できないスキャナは、根拠のない信用を求めていることになります。

画面に出る削減見込みが、実際の空きと合わないことがある

いまのMacのファイルシステムであるAPFSには、クローンという仕組みがあります。同じボリュームの中で作ったコピーは、元のファイルとデータのブロックを共有したまま存在できます。どちらかを書き換えるまで、実体は1つです。

Finderの表示でもduの表示でも、両方が満額のサイズで出ます。それでもディスクが持っているデータは1つ分です。差は測れば分かります。200MBのファイルを作り、cp -cでクローンを作ると、ボリュームの空きが減るのは約1MBにとどまります。それでも両方のファイルは、システム上のすべてのサイズ欄で200MBと表示されます。

dd if=/dev/urandom of=a.bin bs=1m count=200
df -k /            # 空きを控える
cp -c a.bin b.bin  # ブロックを共有するクローン
df -k /            # 空きはほとんど動かない

ハードリンクも似た振る舞いをします。複数のディレクトリ項目が1つのデータを指していて、最後の項目が消えるまで容量は戻りません。検出したファイルの表示サイズを足し算するスキャナは、この2つの場合に削減量を多く見積もります。

だからといって重複が無害になるわけではありません。同じ中身の項目が2つあれば、どちらが現行なのか分からないという問題は残ります。ただし、スキャナの要約画面に出る数字は「ファイルサイズの合計」についての主張であって、「空き容量」についての主張ではありません。大きな削除の前後で、dfの値そのものを控えておくほうが確実です。

判定を自分の手で作り直して照合する

スキャナは、一覧を出すところまでが見えない箱です。同じ一覧は、途中の全段階が見えるコマンドでも作れます。次に消す作業が控えている以上、この差は小さくありません。

find ~/Documents -type f -size +1M -exec shasum -a 256 {} + \
  | sort | awk '{ if ($1 == prev) print; prev = $1 }'

これは~/Documents配下の1MBを超えるファイルを読み、ハッシュとパスを出し、ハッシュで並べ替えて、直前の行と同じハッシュの行だけを表示します。出てくるのは、中身ごとにまとまった「2つ目以降のコピー」の一覧です。1組だけ確かめたいときはcmp -s ファイルA ファイルBを使います。完全に同じときだけ成功で返り、何も出力しません。

コマンド 何を証明するか かかる時間
ls -l バイト数が同じであること 一瞬。根拠としては弱い
shasum -a 256 中身が同じであること ファイル全体を読む
cmp -s 1組の中身が同じであること 両方を読み、最初の相違で止まる
du -h 占有ブロック。クローンも満額で数える 一瞬。APFSでは誤解を招く
df -k ボリュームの空き。削除の前後で比べる値 一瞬。実際に効く数字

手で1回やる目的は、スキャナを使わずに済ませることではありません。目で確かめられる大きさのフォルダで、スキャナの結果と突き合わせる基準を作ることです。2つの一覧が食い違うなら、そのスキャナの初期設定は想定と違う判定を使っています。

一覧に出ていない重複がある

重複の一覧は、そのスキャナが読めた範囲でしか作られません。いまのMacでは、その範囲が思っているより狭くなりがちです。

iCloud Driveに置いたファイルは、ディスク上に実体が無いことがあります。「Macのストレージを最適化」が有効なとき、手元にあるのは中身の場所を指す情報だけで、実体はサーバ側にあります。スキャナがその項目を読むと、中身ではなく指し示す情報のほうを見ることになり、対象から外すか、中身と関係のないサイズを報告します。本当に同じ中身のファイルでも、片方が未ダウンロードなら一覧には出てきません。逆に、無理に比較させると触れたファイルを片端からダウンロードし始めることがあり、重複を1件見つけるための手段としては時間も通信も重くなります。

2つ目の境界は権限です。macOSはユーザライブラリの一部、写真のライブラリ、メールのデータなどを「フルディスクアクセス」の内側に置いています。この権限を渡していないスキャナは、その範囲から何も返しません。しかも、返さなかったことを明示しない作りのものがあります。結果として、何も見つからなかったのか、そもそも見に行けなかったのかが画面から区別できません。権限を渡すこと自体は、その道具に機械の中身をすべて読ませるという判断なので、スキャンの途中で出た確認画面を流れで許可するのではなく、事前に決めておく種類の話です。

3つ目はマウントされていないボリュームです。外付けディスク、ネットワーク共有、開いていないディスクイメージは、スキャンの時点で繋がっていなければ一覧に一切寄与しません。書庫としてのコピーは、たいていそこに置いてあります。内蔵ディスクだけを対象にした重複探しは、唯一の控えが引き出しの中のドライブにあるファイルを、平然と「重複」として並べます。

だからスキャンをやめるべきだという話ではありません。出てきた一覧を、全体ではなく一部の眺めとして扱うという話です。どのボリュームを繋いだ状態で走らせたか、iCloud Driveを手元に降ろした状態だったかを、一覧と一緒に書き留めておきます。欠けた一覧から判断するなら、欠けていることも並べて残す必要があります。

ゴミ箱に入れることと、消えることは別

ゴミ箱を経由した削除は、ゴミ箱を空にするまでは戻せます。空にした後は戻せません。

ゴミ箱から消去された項目は、完全に削除され、使用できなくなります。 出典: support.apple.com

この猶予の長さを変える設定が2つあります。Finderの設定には「30日後にゴミ箱から項目を削除」があり、これを入れると、空にする操作が自分の判断から定期処理に変わります。もう1つは、iCloud Driveからゴミ箱に入れた項目で、こちらはFinderの設定にかかわらず30日で消えます。

道具ごとの差がいちばん大きいのもここです。検出した項目をゴミ箱に移すもの、その道具が管理する隔離フォルダに移すもの、削除のシステムコールを直接呼ぶものがあります。戻せる範囲がそれぞれ違い、隔離フォルダ型はその道具を消すと戻し方まで失われます。走らせる前に、3つのどれなのかを設定画面で確かめておく価値があります。宣伝文ではなく設定の中に書いてあることがほとんどです。

消す前に、消す予定を1枚のテキストにする

役に立つのは、探す作業と消す作業の間にファイルを1枚はさむことです。

消す予定のパスを普通のテキストファイルに書き出します。それを読みます。ファイル単位ではなくディレクトリ単位で並べ替えて眺めます。一覧の中で間違っているのは、1つのファイルであるより、まるごと1つのディレクトリであることのほうがずっと多く、そして見つけやすいためです。

sort dupes.txt | awk -F/ '{ $NF=""; print }' | uniq -c | sort -rn | head -20

これは、検出されたファイルがどのディレクトリから何件出ているかを表示します。数百行を出しているディレクトリは、答えであるか間違いであるかのどちらかで、どちらにしても消す前に一度見ておく対象です。

重複の一覧に出てきたら疑う場所が3つあります。アプリケーションのバンドルは、同じリソースファイルを設計として複数持っており、片方を消すとアプリが壊れます。バージョン管理のディレクトリは、中身でアドレスを決める作りなので、同じ中身が並ぶのが正常です。パッケージ管理のディレクトリは、同じライブラリの複数の版を意図して置いており、その上で動く仕組みがその重複を前提にしています。

判定の材料が3つの窓に散っている

ここまでの手順を振り返ると、実際に時間を取られているのは判定そのものではありません。一覧のテキスト、フォルダの表示、そしてコマンドを打つ場所の3つを行き来する部分です。パスを片方からコピーして、もう片方に少しずれた形で貼るという失敗も、この行き来の途中で起きます。

フォルダとターミナルとAIが同じ窓にある状態なら、一覧を見ながらその場でハッシュを取り、結果を見たまま次のフォルダへ移れます。窓を切り替える手数が減ると、確認の手順を省かずに済むようになります。何ができる状態を指しているのかはできることにまとまっており、他の道具がこの分担をどう扱っているかは他のファイル管理との比較で並べています。細かい挙動の疑問はよくある質問にも整理されています。

無料の重複削除で最初に変えるべきことは、道具を選び直すことではなく、判定の根拠を1回だけ自分で作って突き合わせることです。その1回で、その道具に何を任せてよいかが決まります。

よくある質問

無料の重複ファイル削除ソフトは安全ですか?

スキャンの部分は読み取りだけなので危険はありません。危ないのは削除の段です。仕事のファイルが入ったMacで使う前に、削除先がゴミ箱なのか、その道具の隔離フォルダなのか、即時削除なのかを設定で確かめてください。アプリケーション、バージョン管理、パッケージ管理のディレクトリは対象から外しておくと安全です。

重複を消したのに空き容量が増えないのはなぜですか?

理由は2つあります。APFSでは同じボリューム内のコピーが元とデータを共有することがあり、その場合は2つ目のファイルがほとんど容量を使っていません。ハードリンクも同様です。検出したファイルの表示サイズを合計するスキャナは、この2つの場合に削減量を多く見積もります。削除の前後でdfの値を比べると実態が分かります。

名前の一致とハッシュの一致は何が違いますか?

名前の一致はファイル名だけを比べるため、同じ名前で中身が違うファイルを重複と誤って扱います。ハッシュの一致は全バイトを読んで値を作るので、値が同じなら中身も同じだと言い切れます。ハッシュは全体を読む分だけ遅く、そのため多くのスキャナは名前とサイズで候補を絞ってから使います。

ソフトを入れずに重複を探せますか?

探せます。shasum -a 256findsortと組み合わせれば、macOSに最初から入っているものだけで、中身が同じファイルの一覧を作れます。巨大なフォルダでは専用ソフトより時間はかかりますが、消す前に1行ずつ目で確かめられる形式で出力できるという利点があります。

記事一覧へ戻る