Linux / コマンド / cp - コピーするコマンド, mv - 移動するコマンド

Linux では、cp はファイルまたはディレクトリをコピーし、mv はファイルまたはディレクトリを移動または名前変更します。両方のコマンドの結果は、最終パスが既存のディレクトリかどうかによって異なるため、実行前に対象のパスを確認する必要があります。

コピーと移動の違い

2つのコマンドの基本形式はcp source destinationとmv source destinationです。コピーは元のファイルの別のコピーを残しますが、移動や名前変更は成功後に元のパスからアイテムを削除します。以下の例はGNU coreutilsのcpとmvに基づいています。

既存のファイルは同じ名前で上書き可能なので、重要なデータを扱う前にパスや対象コンテンツを確認し、必要なバックアップを準備してください。以下の演習は新しく作成された空のディレクトリで行われます。

演習用ファイルの準備

以下は、現在の場所にcp-mv-practiceディレクトリがまだ存在しない場合の例です。同じ名前のディレクトリがすでに存在する場合は、別の空の場所で練習してください。最初のコマンドが失敗した場合、後続のコマンドを実行しないでください。

mkdir cp-mv-practice
cd cp-mv-practice
printf 'Hello Linux\n' > note.txt
mkdir target
ls

note.txtファイルと空のtargetディレクトリが表示されます。後続の例はこのディレクトリ内で順番に実行されます。printfの>は、同名のファイルが存在する場合、内容を上書きするので、実際のデータがない場所で使用してください。

ファイルのコピー

以下のコマンドは、現在のディレクトリ内でnote.txtをcopy.txtにコピーします。成功した場合、元のファイルとコピーの両方が存在します。

cp note.txt copy.txt
ls
cat copy.txt

cat はコピーしたファイルの内容 Hello Linux を表示します。以下のコマンドは、それを既存のディレクトリ target に元の名前でコピーします。

cp note.txt target/
ls target

指定されたターゲット名が既存のディレクトリでない場合は、その名前のファイルが作成されるか、既存のファイルが上書きされる可能性があります。したがって、target がディレクトリであれば cp note.txt target はその中にファイルをコピーしますが、存在しない場合は target という名前のファイルが作成されます。ディレクトリ内で別の名前でコピーするには、cp note.txt target/other.txt に示すように完全なターゲットパスを指定してください。

ディレクトリのコピー

ディレクトリとその内容をコピーする際には、再帰オプション -r を使用してください。以下のコマンドは、以前に作成した target をまだ存在しない target-copy にコピーします。

cp -r target target-copy
ls target-copy

その結果、target-copy/note.txt が作成され、元の target/note.txt はそのまま残ります。逆に、ターゲットディレクトリがすでに存在する場合、元のディレクトリは通常その中に配置されます。例えば、再度 cp -r target target-copy を実行すると target-copy/target が作成される場合があります。実行する前に ls でターゲットを確認してください。

GNU cp -a は、再帰的コピーを行う際にリンク、パーミッション、タイムスタンプなどの属性をできるだけ保持しようとします。すべての属性が保持されるという保証はなく、権限やターゲットファイルシステムのサポート状況によって異なります。シンボリックリンクの扱いもオプションによって異なるため、コピー後には重要なデータを確認してください。詳細については、GNU cp マニュアル を参照してください。

ファイルの移動と名前変更

次のコマンドは、以前に作成されたcopy.txtをrenamed.txtに名前を変更します。成功すると、copy.txtは消え、renamed.txtが表示されます。

mv copy.txt renamed.txt
ls

次に、ファイルを既存のディレクトリに移動します。renamed.txtは元の場所にはもう存在せず、target/renamed.txtが作成されます。

mv renamed.txt target/
ls target

ディレクトリを移動または名前変更する場合、mvを使用し、cpの-rは不要です。対象ディレクトリが既に存在する場合はその中に移動し、対象が存在しない場合は指定された名前で移動します。既存の非空ディレクトリと衝突する場合は失敗することがあるため、コピーのように結合されるとは考えないでください。

異なるファイルシステム間では、GNU mv はコピー後に元のファイルを削除することで対応できます。大きなデータの場合は時間がかかることがあり、途中で失敗すると一部しか移動しないことがあるため、両方の場所で結果を確認してください。詳細な条件はGNU mvマニュアルで確認できます。

上書きおよびパスのエラーの確認

既存のファイルを上書きする前に確認を受けるには-iを使用してください。以下は、同じ名前のファイルがすでに存在する場合の練習シナリオです。指示が表示されたら、それを読み、上書きするつもりがある場合のみ承認してください。

cp -i note.txt target/note.txt

mv -i も既存のターゲットファイルを置き換える前に確認を求めます。対話式の確認は自動化スクリプトでの競合処理の代わりにはならないため、スクリプトでは意図した動作と終了ステータスを別途確認してください。デフォルトの動作は、コマンドがエイリアスとして設定されている環境では異なる場合があります。

  • パスにスペースが含まれている場合: cp "my file.txt" "target/my file.txt" のように各パスを引用符で囲みます。
  • ファイルやディレクトリが見つからない場合: pwd および ls を使用して、現在の場所、スペル、および大文字小文字を確認してください。
  • パーミッションエラーが発生した場合: ソースに対して読み取り権限があり、宛先に対して書き込み権限があることを確認し、さらに移動時にはソースディレクトリの必要な権限も確認してください。権限がない場合は、管理者に依頼してください。

実際の結果を確認した後、必要であればファイル管理ツールを使用してcp-mv-practiceディレクトリを削除することができます。Midnight Commander のように、ファイルリストを見ながらファイルのコピーや移動ができるツールもありますが、サーバーにインストールされているかどうかや使用権限は環境によります。