ファイルが作れるようになると、次に必ずやりたくなるのが「コピーしておきたい」「別の場所に移したい」「名前を変えたい」の3つです。
Windows ならドラッグ&ドロップや右クリックでできますが、ターミナルでは cp と mv の2つのコマンドで、この3つが全部できます。ただし、Linux のコピーや移動は、同じ名前のファイルがあると、何も聞かずに上書きすることがあります。私も設定ファイルのバックアップを、うっかり古いもので上書きしたことがあります……。この記事では、その防ぎ方まで一緒に見ていきましょう。
-
cpでファイルをコピーする方法 -
cp -rでディレクトリごとコピーする方法 -
mvで、ファイルの移動と名前の変更をする方法 -
-iを付けて、うっかり上書きを防ぐ方法
-
pwd・ls・cdと、パスの書き方がわかる -
mkdir・touch・echoでファイルやディレクトリを作れる
まだの方は、前の記事「Linuxでファイルとフォルダを作る|mkdir・touch・echoの使い方【初心者向け】」から読むのがおすすめです。
- ターミナル:文字を打ってパソコンに指示を出すための画面(アプリ)。いわゆる「黒い画面」です。打った文字を読み取って動かすのは、この中で動いている「シェル」です
- コマンド:パソコンへの指示の言葉。ターミナルに打って Enter で実行します
- ディレクトリ:フォルダのこと
用語で迷ったら、連載のまとめ記事の「よく出てくる用語ミニ辞典」でも確かめられます。
結論:cp は「複製」、mv は「引っ越し+名前変更」
| やりたいこと | コマンド | 例 |
|---|---|---|
| ファイルをコピーする | cp コピー元 コピー先 | cp memo.txt memo-backup.txt |
| ディレクトリごとコピーする | cp -r コピー元 コピー先 | cp -r notes notes-backup |
| ファイルを移動する | mv 移動するもの 移動先 | mv memo.txt archive/ |
| 名前を変える | mv 今の名前 新しい名前 | mv todo.txt todo-2026.txt |
| 上書きの前に確認する | -i を付ける | cp -i・mv -i |
どちらも「左が元、右が行き先」の順番で書きます。ここだけは最初に覚えておきましょう。
準備:練習用のファイルを用意する
この記事でも、練習は ~/linux-practice の中だけで行います。次のコマンドで、練習用のディレクトリとファイルを用意しましょう。
- 1
- 2
- 3
- 4
- 5
mkdir -p ~/linux-practice/copy-test
cd ~/linux-practice/copy-test
echo "元のメモです" > memo.txt
touch todo.txt
lsここから先の出力例は、Debian 13での実行例です(ユーザー名 kaito・パソコン名 demo のダミー環境)。UbuntuやWSL(=Windows の中で Linux を動かせる、Microsoft のしくみ)では、表示が少し違うことがあります。
(例)
- 1
memo.txt todo.txtcp:ファイルをコピーする
cp(シーピー)は copy の略です。memo.txt のコピーを、memo-backup.txt という名前で作ってみましょう。
- 1
- 2
- 3
cp memo.txt memo-backup.txt
ls
cat memo-backup.txt(例)
- 1
- 2
- 3
- 4
kaito@demo:~/linux-practice/copy-test$ ls
memo-backup.txt memo.txt todo.txt
kaito@demo:~/linux-practice/copy-test$ cat memo-backup.txt
元のメモです元の memo.txt は残ったまま、同じ中身の memo-backup.txt が増えました。
ディレクトリの中にコピーする
行き先にディレクトリを指定すると、同じ名前のまま、そのディレクトリの中にコピーされます。
- 1
- 2
- 3
mkdir -p backup
cp memo.txt backup/
ls backup(例)
- 1
memo.txtbackup/ のように、最後に / を付けておくと「ディレクトリの中へ」という意味がはっきりするので、おすすめです。
cp -r:ディレクトリごとコピーする
ディレクトリを cp だけでコピーしようとすると、エラーになります。
- 1
cp backup backup-copy(例)
- 1
cp: -r not specified; omitting directory 'backup'「-r が指定されていないので、ディレクトリ backup は飛ばしました」という意味です。ディレクトリは、中にファイルやディレクトリが入っている「入れ物」です。中身ごとまとめてコピーするには、-r(recursive=中までたどる)を付けます。
- 1
- 2
- 3
cp -r backup backup-copy
ls
ls backup-copy(例)
- 1
- 2
- 3
- 4
kaito@demo:~/linux-practice/copy-test$ ls
backup backup-copy memo-backup.txt memo.txt todo.txt
kaito@demo:~/linux-practice/copy-test$ ls backup-copy
memo.txtcp -r を2回打つと、中に入れ子ができる 行き先の backup-copy がまだないときは、backup の中身が backup-copy という名前でコピーされます。ところが、backup-copy がもうあるときに同じコマンドをもう一度打つと、backup-copy の中に backup ごとコピーされて、backup-copy/backup/memo.txt のような入れ子ができます。「さっきと同じコマンドなのに、結果が違う」ときは、ls 行き先 で中身を確かめてみてください。
私の環境(Debian 13)で、backup-copy がまだない状態から、同じコマンドを2回続けて打つと次のようになりました(記事の手順をひと通り終えたあとに確かめています)。
(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
kaito@demo:~/linux-practice/copy-test$ cp -r backup backup-copy
kaito@demo:~/linux-practice/copy-test$ ls backup-copy
memo.txt
kaito@demo:~/linux-practice/copy-test$ cp -r backup backup-copy
kaito@demo:~/linux-practice/copy-test$ ls backup-copy
backup memo.txt
kaito@demo:~/linux-practice/copy-test$ find backup-copy
backup-copy
backup-copy/memo.txt
backup-copy/backup
backup-copy/backup/memo.txt1回目は backup-copy の中に memo.txt だけでしたが、2回目のあとは backup が増えて、backup-copy/backup/memo.txt という入れ子ができています。find は、中のファイルやディレクトリをすべてたどって一覧にするコマンドです。
設定ファイルや自動化のスクリプト(=やりたい処理を順番に書いておき、まとめて実行できるファイル)を書き換える前に、cp -r 作業ディレクトリ 作業ディレクトリ-backup のようにコピーしておくと、失敗しても元に戻せます。地味ですが、私がいちばん使っている使い方です。
mv:移動と、名前の変更
mv(エムブイ)は move(動かす)の略です。cp と違って、元の場所からはなくなります。
ファイルを移動する
- 1
- 2
- 3
- 4
mkdir -p archive
mv todo.txt archive/
ls
ls archive(例)
- 1
- 2
- 3
- 4
kaito@demo:~/linux-practice/copy-test$ ls
archive backup backup-copy memo-backup.txt memo.txt
kaito@demo:~/linux-practice/copy-test$ ls archive
todo.txt名前を変える
Linux には「名前を変える専用のコマンド」は基本的にありません。同じ場所に、別の名前で移動すると考えて、mv を使います。
- 1
- 2
mv memo-backup.txt memo-old.txt
ls(例)
- 1
archive backup backup-copy memo-old.txt memo.txtディレクトリの名前を変えるときも同じです。mv は、ディレクトリでも -r なしで動きます。
- 1
- 2
mv backup-copy backup-2026
ls(例)
- 1
archive backup backup-2026 memo-old.txt memo.txt-i:うっかり上書きを防ぐ
ここがこの記事でいちばん大事なところです。cp と mv は、行き先に同じ名前のファイルがあると、確認なしで上書きします。
練習用のファイルで、実際に確かめてみましょう。
- 1
- 2
- 3
echo "新しいメモです" > new.txt
cp new.txt memo.txt
cat memo.txt(例)
- 1
新しいメモです何も聞かれずに、memo.txt の中身が入れ替わってしまいました。
今回の Debian 13 では、type cp と type mv で調べると、それぞれ cp is hashed (/usr/bin/cp)・mv is hashed (/usr/bin/mv) と表示されました。hashed は「一度使ったので、bash が場所(/usr/bin/cp)を覚えています」という意味で、ふつうのプログラムとして動いているということです。これは、-i が自動で付く設定(エイリアス)がないという意味です。環境によっては、cp や mv に最初から -i が付くように設定されていて、上書きの前に確認が出ることもあります。どちらの環境でも困らないように、自分で -i を付ける習慣をつけておくと安心です。
上書きを防ぐのが -i(interactive=確認しながら)です。
- 1
cp -i memo-old.txt memo.txt(例)
- 1
cp: overwrite 'memo.txt'? noverwrite 'memo.txt'? は「memo.txt を上書きしますか?」という意味です。上の例では n と答えたので、memo.txt はそのまま残っています。確認が出たら、上書きしてよければ y、やめるなら n を押して Enter です。迷ったら n にしましょう。mv -i も同じように動きます。
Linux のターミナルには、ゴミ箱も「元に戻す」もありません。大事なファイルの近くで cp や mv を使うときは、-i を付けるか、先に ls で行き先に同じ名前がないか確かめる習慣をつけましょう。
🤖 詰まったらAIに聞こう:コピーや移動がうまくいかない
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
Linuxの初心者です。cp(または mv)でファイルをコピー・移動しようとしたら、思ったとおりになりませんでした。
何が起きたのか、どう書けばよかったのかを教えてください。
【使っている環境】WSLのUbuntu など
【今いる場所(pwd の結果)】ここに貼る
【実行前の ls の結果】ここに貼る
【実行したコマンド】ここに貼る
【表示されたメッセージ/実行後の ls の結果】ここに貼る
【本当はこうしたかった】例:memo.txt を archive ディレクトリの中に移したかったls の結果やファイルの中身を貼るときは、パスワード、APIキー、トークン、取引先の名前などが写っていないか確認しましょう。APIキーやトークンは、Web のサービスを使うときに本人の代わりになる、合言葉のような文字列です。気になる部分は「***」に置き換えてから貼ってください。
よくあるつまずき
「No such file or directory」と出る
コピー元・移動元の名前が間違っているか、今いる場所が違うときに出ます。たとえば、ない nothing.txt をコピーしようとすると、次のようになります(cannot stat は「ファイルの情報を読み取れない」という意味です)。
(例)
- 1
cp: cannot stat 'nothing.txt': No such file or directoryまずは pwd で今いる場所を、ls でファイルの名前を確かめましょう。名前の打ち間違いを防ぐには、ファイル名の途中まで打って Tab キーを押すと、続きを自動で入力してくれます(くわしくは、この連載の「困ったときの調べ方」の記事で扱います)。
移動したつもりが、名前が変わっていた
mv memo.txt archiv のように、行き先のディレクトリ名を打ち間違えると、「archiv という名前に変更」と受け取られてしまいます。エラーにならないので気づきにくいんです。
これを防ぐには、行き先がディレクトリのときは最後に / を付けるのがおすすめです。mv memo.txt archiv/ なら、archiv というディレクトリがないときにエラーで止まってくれます。
(例)
- 1
- 2
kaito@demo:~/linux-practice/copy-test$ mv memo.txt archiv/
mv: cannot move 'memo.txt' to 'archiv/': Not a directory「Not a directory(ディレクトリではありません)」と出て、エラーで止まりました。archiv/ という行き先のディレクトリがないので、名前の変更として受け取られずに済んだわけです。
メッセージが日本語で出る環境では
日本語の設定(ロケール)になっている環境では、同じエラーや確認が日本語で表示されます。今回の Debian 13 で日本語の設定にして試すと、次のようになりました(記事と同じ copy-test の中で、同じファイルを使って試しています)。
(例)
- 1
- 2
- 3
- 4
cp: -r が指定されていません; ディレクトリ 'backup' をスキップしています
cp: 'nothing.txt' を stat できません: そのようなファイルやディレクトリはありません
mv: 'memo.txt' から 'archiv/' へ移動できません: ディレクトリではありません
cp: 'memo.txt' を上書きしますか? n英語で表示されても日本語で表示されても、意味は同じです。エラーをAIに聞くときは、表示されたとおりに貼れば大丈夫です。
よくある質問
Q. cp と mv、どちらを使えばいいか迷ったら?
元のファイルを残しておきたいなら cp、元の場所からなくしてよいなら mv です。迷ったら、まず cp でコピーしておき、うまくいったのを確かめてから元を消すほうが安全です。
Q. 毎回 -i を付けるのが面倒です。
練習のうちは、大事なファイルの近くで使うときだけでも -i を付けましょう。毎回自動で付ける設定(エイリアス)もありますが、それは連載の Lv3(環境変数と .bashrc・alias の回)で扱います。
まとめ
-
cp 元 先でコピー。ディレクトリごとならcp -r -
mv 元 先で移動。同じ場所で別の名前にすれば「名前の変更」 - どちらも「左が元、右が行き先」
- 同じ名前があると、確認なしで上書きする。
-iを付けると確認してくれる - 行き先がディレクトリなら、最後に
/を付けると打ち間違いに気づける
コピーと移動ができるようになると、ファイルの整理がぐっと楽になります。次は、いよいよファイルを消すコマンドです。ターミナルで消したファイルはゴミ箱に入らないので、消しすぎないための習慣を一緒に身につけましょう。
次に読む記事
関連する記事
- Pythonで毎日の作業を自動化する入門|ダウンロードフォルダを自動で整理しよう:ファイルの移動や名前の変更を、Python で自動にしたい方に
- Excel・CSVを毎回手で結合していませんか?Pythonで1分にする方法(重複削除・列名ゆれ対応):コピーして集めたファイルを、まとめて処理したい方に
- Git入門|init・add・commit を1回やってみる:コピーでバックアップを取る代わりに、変更の履歴を残したい方に