ファイル コピー で なく 移動にする|Macで確実に移す方法
フォルダを外付けドライブにドラッグしたのに、元の場所にもそのまま残っている。ファイル コピー で なく 移動にしたいのに、勝手にコピーになる。これは不具合ではなく、Finderが移動先の場所を見て動きを切り替えた結果です。
切り替えの基準は1つしかありません。その基準が見えると、この挙動は「たまにおかしくなるもの」から「こちらが指定できるもの」に変わります。ここでは基準そのものと、移動だと明示する4つの方法、移動とコピーでディスクの中で起きていることの違い、そして移動を選んだときだけ後から効いてくる場所を扱います。
基準はフォルダではなくボリューム
同じボリュームの中の場所へドラッグすると移動になります。別のボリュームへドラッグするとコピーになり、元のファイルはその場に残ります。
規則はこれだけで、噛み合わないと感じるほとんどの場面はこれで説明がつきます。書類フォルダからデスクトップへのドラッグが移動になるのは、どちらも起動ボリュームの中だからです。USBメモリへのドラッグがコピーになるのは、USBメモリが別のボリュームだからです。外付けドライブから別の外付けドライブへのドラッグも、同じ理由でコピーになります。
この設計の意図は保護です。取り外せる記憶装置やネットワーク上の場所は転送中に消えることがあり、失敗したコピーは元が残るのに対して、失敗した移動は何も残らない可能性があります。代わりに困るのは、安全側の初期動作がいつも望んだ動作とは限らないことと、コピーになったことをFinderが知らせないことです。
境界を分かりにくくする要素が2つあります。ディスクイメージはそれ自体が1つのボリュームとしてマウントされるため、イメージのファイルが起動ディスク上にあっても、その中へのドラッグはコピーになります。もう1つは、いまのMacで普通の構成である「同じコンテナ内に複数のAPFSボリューム」で、物理的な空き領域を共有していても、この判定では別のボリュームとして扱われます。
移動先がどちら側かをその場で確かめるには、「表示」>「パスバーを表示」を選びます。いちばん左に出るのがボリュームの名前です。
移動だと明示する4つの方法
Finderにはファイルの「カット」がありません。他の環境から来た人が最初に戸惑うのはここです。相当する操作は存在しますが、独立したカットではなく、ペースト側の修飾キーとして用意されています。
ファイルを別のディスクに移動する: Commandキーを押したまま、ファイルをそのディスクにドラッグします。 出典: support.apple.com
2つ目はコピーとペーストを使う道です。ファイルを選んでCommand+C、移動先へ行き、Optionキーを押しながらCommand+Vを押します。Optionを押している間、「編集」メニューの項目が「項目をペースト」から「ここに項目を移動」に変わるので、実行する前に目で確認できます。転送が終わると元は消えます。
3つ目はターミナルです。mv 元 先は、どのボリュームが関わっていても移動になります。修飾キーもダイアログもありません。
4つ目は、あえて知っておく価値のある逆の操作です。Optionキーを押しながらのドラッグは、同じボリューム内でも移動ではなくコピーになります。OptionとCommandを同時に押すとエイリアスができます。移動したいときに指が触れていると、意図と逆のことが起きます。
| 操作 | 同じボリューム | 別のボリューム |
|---|---|---|
| ドラッグ | 移動 | コピー |
| Command+ドラッグ | 移動 | 移動 |
| Option+ドラッグ | コピー | コピー |
| Option+Command+ドラッグ | エイリアス | エイリアス |
| Command+C から Command+V | コピー | コピー |
| Command+C から Option+Command+V | 移動 | 移動 |
| Command+D | その場に複製 | 該当なし |
覚える価値がいちばん高い行はCommand+ドラッグです。ボリュームの境界の両側で同じ結果になるため、移動先がどのボリュームかを知らなくてよくなります。
移動とコピーでは、中で起きていることが違う
同じボリュームの中では、移動は名前の付け替えです。データはどこにも動きません。ファイルを指しているディレクトリの項目が、片方の親から外れてもう片方の親につながるだけで、その情報を書き終えれば完了します。4KBのファイルでも40GBのファイルでも所要時間は変わりません。
別のボリュームへの移動には、そういう操作がそもそも存在しません。macOSのmvのマニュアルはその帰結をはっきり書いています。ファイルシステムをまたぐとrenameのシステムコールが使えないため、mvはcpとrmで代行します。効果としては、移動先のパスを消し、cp -pRPで元をコピーし、元を消すのと同じです。
この代行から3つのことが導かれます。
- 時間。ボリュームをまたぐ移動は、同じ量のコピーと同じだけかかります。速い経路はありません。止まって見える進捗バーは、コピーが止まっているだけです
- 中断。途中で止まると、元はそのまま残り、中途半端な移動先も残ることがあります。失われるものはありませんが、正常に終わるまで移動先は信用できません。同じボリューム内の移動にはこの窓がなく、書けたか書けなかったかのどちらかです
- 属性。
-pRPは変更日時、アクセス日時、フラグ、アクセス制御リストを、移動先のファイルシステムが対応している範囲で保ちます。対応していなければ、何も言わずに落ちます
3つ目は見た目より重い話です。Finderのタグは拡張属性として保存されているため、exFATやFATで初期化したドライブに移して戻すと、タグが消えた状態で戻ってきます。エラーは出ません。
「置き換え」と「結合」は別の答え
同じ名前のフォルダがすでにある場所へフォルダをドラッグすると、確認のダイアログが出ます。そこに並ぶ選択肢は、2つのフォルダの中身によって変わります。
Optionキーを押しながらドラッグすると「結合」を選べます。両方の項目を残す動きです。Appleの資料は、この選択肢が出る条件を具体的に書いています。「結合」が現れるのは、片方のフォルダに、もう片方にはない項目が含まれている場合だけです。同じ名前でバージョンの違うファイルが入っている場合、選べるのは「中止」か「置き換え」しかありません。
「置き換え」は、優先順位を付けた結合ではありません。移動先のフォルダを消して、そこに元のフォルダを置きます。移動先にしか無かったファイルは無くなります。移動がコピーなら守れたはずの作業を壊す経路として、これがいちばん多い形です。ダイアログの文面がファイル1件ずつの質問のように読めるのに、動きはフォルダ単位だからです。
移動先に同名のフォルダがあるときの安全な習慣は、先にどちらかの名前を変え、転送を終わらせてから、2つのフォルダの差を見える形で突き合わせることです。2つのフォルダを並べて比べる作業は、Finderが持っていない機能のひとつで、専用の他のファイル管理との比較を見ると各アプリの扱いが分かります。
コピーなら起きない、移動で起きること
エイリアスは移動しても追随します。シンボリックリンクは追随しません。エイリアスは対象への持続的な参照を持っていて、同じボリューム内で対象が移動しても効き続けますが、シンボリックリンクはパスの文字列を持っているだけなので、そのパスが解決できなくなった時点で切れます。スクリプトの中のもの、開発中のディレクトリの中のもの、ln -sで作ったものはすべて後者です。
iCloud Driveに置いていて「Macのストレージを最適化」が有効なファイルは、手元には場所を指す情報だけがある状態のことがあります。iCloud Driveの外へ移動するには先に中身のダウンロードが必要で、その間、転送は止まって見えます。大きなフォルダをこの経路で移すと、想定よりずっと多くの通信が発生します。
開いたままの書類は、同じボリューム内の移動には付いてきます。アプリはパスではなく参照を持っているためです。ボリュームをまたぐと移動先のファイルは別のファイルになり、保存していない変更を持ったアプリが、それを元の場所に書き戻すことがあります。ボリュームをまたぐ移動の前に書類を閉じておけば、この問題は起きません。
Time Machineは、移動したファイルを移動先の新しいファイルとして扱います。大規模な整理をすると次のバックアップが大きくなるので、バックアップ用ディスクの空きが少ないときは順番を考える価値があります。
ターミナルで移動するときに残す歯止め
mvは移動先を黙って上書きします。それが初期動作です。
mv -n 元 先
mv -i 元 先
上は既存のファイルを上書きしません。下は1件ごとに確認します。移動先に同じ名前がある可能性があるまとまった移動では、-nから始めるほうが安全です。できるところまで終わらせて、ぶつかったものだけをその場に残すので、後から見直せます。
ボリュームをまたぐ大きな転送では、rsync -a --remove-source-files 元/ 先/が使えます。コピーを終えたファイルから順に元を消す動きなので、途中で止まっても、消えたのは移し終えたものだけです。空のディレクトリ構造は残りますが、これは意図された動きで、後からまとめて片付けられます。
名前についての制約も1つあります。Macのファイル名にはコロンを使えず、長さは255文字までです。移動と同時に名前を変えるとき、転送ではなく名前のほうで失敗することがあります。
終わったあとに、何が起きたのかを確かめる
Finderは進み具合を出しますが、結果は出しません。元が消えた場合でも残った場合でも、転送のウインドウは同じように閉じます。だから確認は意識してやる必要があります。
いちばん速いのは、元の場所そのものを見ることです。ウインドウが閉じたあとにまだ項目が残っていれば、起きたのはコピーです。当たり前に見えて、これはよく飛ばされます。長い転送のあとに自然と向かう先は、来た場所ではなく着いた場所だからです。
フォルダの場合は、眺めるより数えるほうが確実です。Finderウインドウの下部のステータスバーには、そのフォルダの項目数とディスクの空きが出ます。出ていない場合は「表示」>「ステータスバーを表示」で戻せます。両端の項目数を比べると、途中で止まった転送を、フォルダのサイズを比べるより確実に捕まえられます。サイズはファイルシステムが違えば正当に食い違うことがあるためです。
中身まで確かめたいときはdiff -rq 元 先を使います。両方の木をたどり、違うところだけを出します。何も出なければ、片方にあるファイルはすべてもう片方にも同じ中身で存在しています。大きな木では時間がかかりますが、コピーで終わった元を消す前に走らせる価値があるのはまさにその手間の分です。
空き容量も判断材料になります。転送の前後で、両方のボリュームのdf -hを控えます。ボリュームをまたぐ移動なら、移動先が減り、元を消した時点で元の側が戻るはずです。元の側が戻らないなら、元のファイルはまだそこにあります。
判断に必要な材料が、別々の窓にある
ここまでの判断はどれも、同じ情報を必要としています。移動先がどのボリュームか、そこに同じ名前のものがあるか、いま動いているのはコピーなのか移動なのか。Finderはこのうち1つ目を明示せず、3つ目も知らせません。結果として、パスバーを見て、ターミナルでdfやlsを打って、またFinderに戻る、という往復が起きます。
フォルダとターミナルとAIが同じ窓にある状態なら、移動先のボリュームを確かめてから、同じ画面でmv -nを打てます。窓を切り替える手数が消えると、確認を飛ばす理由も消えます。どんな操作がひとつの画面に収まるかはできることにまとまっており、移動の途中で席を立つ場合の続きはiPhone・iPadから続きをで扱っています。
移動とコピーの取り違えは、知識ではなく手数の問題として起きます。減らすべきなのは覚える量ではなく、確かめるために開く窓の数です。
よくある質問
外付けドライブにドラッグするとコピーになるのはなぜですか?
移動先が別のボリュームだからです。Finderは同じボリューム内では移動、別のボリュームへはコピーとして動きます。取り外せる記憶装置やネットワーク上の場所への転送が失敗したときに、何も残らない状態を避けるための設計です。Commandキーを押しながらドラッグすれば、どちらの場合でも移動になります。
Finderにファイルのカットはありますか?
独立したコマンドとしてはありません。相当する操作は、Command+Cでコピーしてから、移動先でOption+Command+Vを押すことです。Optionを押している間は「編集」メニューの項目が「ここに項目を移動」に変わり、転送が終わると元のファイルが消えます。
大きいファイルの移動は時間がかかりますか?
同じボリューム内なら変わりません。ボリューム内の移動は情報の書き換えなので、サイズの影響を受けません。ボリュームをまたぐ場合はコピーしてから削除する動きになるため、同じ量をコピーするのと同じだけ時間がかかります。
USBメモリに移動するとFinderのタグはどうなりますか?
ドライブの初期化形式によります。タグは拡張属性として保存されており、APFSとMac OS拡張は保持します。exFATやFATは拡張属性に対応していないため、転送の途中でタグが落ちます。エラーの表示は出ないので、タグを使っている場合は形式を先に確認してください。