cp --remove-destinationオプションとは?初心者向けに上書きコピー時の削除処理を解説!
生徒
「Linuxでファイルをコピーするときって、上書きされちゃうんですよね?安全にコピーする方法ってありますか?」
先生
「そのとおり。特にcpコマンドで同じ名前のファイルにコピーすると、通常はそのまま上書きされてしまいます。」
生徒
「もしコピー先のファイルを一度消してからコピーしたい場合はどうするんですか?」
先生
「そんなときは--remove-destinationオプションが便利ですよ。コピー先のファイルを一度削除してからコピーしてくれるんです!」
1. cpコマンドの基本をおさらい
Linuxのcpコマンドは、「ファイル」や「ディレクトリ」をコピーするための基本的なコマンドです。
たとえば、次のようにすればファイルをコピーできます。
cp file1.txt backup.txt
この場合、backup.txtがすでに存在していれば、file1.txtの内容で上書きされます。ただし、このとき「元の属性」や「アクセス権限」が一部残ることがあります。
2. --remove-destinationオプションとは?
--remove-destinationオプションを使うと、コピー先のファイルが存在している場合に、まずそのファイルを削除してから新しいファイルをコピーします。
この動作により、コピー元のファイルの内容だけでなく、パーミッション(権限)や所有者情報も正確に反映されやすくなります。
次のように使います。
cp --remove-destination file1.txt backup.txt
3. 実際の動作を確認してみよう
まず、テスト用のファイルを2つ用意します。
echo "元のファイル" > original.txt
echo "古いバックアップ" > backup.txt
普通にcpすると、上書きされますが属性は維持される可能性があります。
しかし、--remove-destinationを使えば、コピー先が一旦削除されるので、次のように振る舞います。
cp --remove-destination original.txt backup.txt
この操作により、backup.txtが一度削除され、original.txtが新しくコピーされます。
4. 通常の上書きとどう違うの?
普通のcpでは、次のように「内容だけ」上書きされます。
cp file1.txt file2.txt
この方法では、コピー先ファイルのパーミッションやオーナー情報がそのまま残ることがあります。
一方、--remove-destinationを使うと、元のファイルが完全に削除された後でコピーされるため、属性も上書きされやすくなります。
とくにルート権限(管理者権限)で作成されたファイルを一般ユーザーがコピーするときに、この違いが重要になります。
5. -f(強制)や-i(確認)との違い・組み合わせ
-fオプションは「強制的に上書き」する動作です。
cp -f file1.txt file2.txt
これは「確認なしで上書きする」だけで、削除してからコピーするわけではありません。
一方で、-i(インタラクティブ)オプションは、上書きする前に確認してくれます。
cp -i file1.txt file2.txt
--remove-destinationは、あくまで事前に削除してからコピーという特殊な動作です。
つまり、安全に属性も含めて完全に置き換えたい場合は--remove-destinationが適しています。
6. シンボリックリンクとの違いにも注意
Linuxでは「シンボリックリンク(別名ファイル)」という特殊なファイルがあります。
シンボリックリンクを上書きする場合、通常のcpではリンクの先が上書きされますが、--remove-destinationを使うとリンク自体が削除されて実体ファイルとしてコピーされます。
そのため、リンク構造を壊したくないときはこのオプションを避けるようにしましょう。
7. 実行時の権限に注意しよう
コピー先のファイルを削除するには、「削除する権限」が必要です。
たとえば、backup.txtがroot(管理者)ユーザーが作ったファイルであれば、通常ユーザーでは削除できません。
このようなときに--remove-destinationを使おうとしても、次のようなエラーになります。
cp: cannot remove 'backup.txt': Permission denied
この場合は、管理者権限(sudo)を使う必要がありますが、危険なので注意が必要です。