[UNIXコマンド]cpコマンドの基本を理解する

先生

ファイルやディレクトリをコピーするcpコマンドについて紹介します。

「cp」コマンドとは

cpコマンドは、LinuxやmacOSなどのUnix系OSでファイルやディレクトリをコピーするためのコマンドです。

cpコマンドの基本的な使い方

コピー元とコピー先のファイルパスもしくはディレクトリパスを引数に指定することでファイルコピーができます。また複数のコピー元を指定することで、複数のファイル・ディレクトリをコピーすることができます。

# <ファイルパス1>を<ファイルパス2>としてコピーする
cp <ファイルパス1> <ファイルパス2>

# <ファイルパス>を<ディレクトリパス>の配下へ同名のファイル名でコピーする
cp <ファイルパス> <ディレクトリパス>

# <ファイルパス1>,<ファイルパス2>...を<ディレクトリパス>の配下へ同名のファイル名でコピーする
cp <ファイルパス1> <ファイルパス2> ... <ディレクトリパス>

使用例1

root@localhost:~$ ls -l
total 10004
drwxr-xr-x 2 root root     4096 Mar 22 16:14 dir1
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
root@localhost:~$ cp file1.txt file2.txt
root@localhost:~$ 
root@localhost:~$ ls -l
total 20004
drwxr-xr-x 2 root root     4096 Mar 22 16:14 dir1
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 22 16:22 file2.txt   <--- コピーされたファイル
root@localhost:~$ 

使用例2

root@localhost:~$ ls -lR
.:
total 20004
drwxr-xr-x 2 root root     4096 Mar 22 16:27 dir1
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 22 16:30 file2.txt

./dir1:
total 0
root@localhost:~$ cp file1.txt file2.txt dir1/
root@localhost:~$ 
root@localhost:~$ ls -lR
.:
total 20004
drwxr-xr-x 2 root root     4096 Mar 22 16:32 dir1
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 22 16:30 file2.txt

./dir1:
total 20000
-rw-r--r-- 1 root root 10240000 Mar 22 16:32 file1.txt   <--- コピーされたファイル
-rw-r--r-- 1 root root 10240000 Mar 22 16:32 file2.txt   <--- コピーされたファイル
root@localhost:~$ 

cpコマンドのオプション

いくつか便利なオプションがあります。

オプション詳細
-rディレクトリごとをコピー
-pパーミッションやタイムスタンプを保持する
-i上書き前に確認する
-n既存ファイルを上書きしない
-vコピーの詳細を表示する
-u変更されたファイルのみ上書きする

以降で各オプションの使い方について紹介します。

-r:ディレクトリごとをコピー

ディレクトリごとコピーできます。

# <ディレクトリパス1>を<ディレクトリパス2>としてコピーする
cp -r <ディレクトリパス1> <ディレクトリパス2>

使用例

root@localhost:~$ ls -lR
.:
total 20004
drwxr-xr-x 2 root root     4096 Mar 22 16:32 dir1
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 22 16:30 file2.txt

./dir1:
total 20000
-rw-r--r-- 1 root root 10240000 Mar 22 16:32 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 22 16:32 file2.txt
root@localhost:~$ cp -r dir1 dir2
root@localhost:~$ 
root@localhost:~$ ls -lR
.:
total 20008
drwxr-xr-x 2 root root     4096 Mar 22 16:32 dir1
drwxr-xr-x 2 root root     4096 Mar 22 16:38 dir2
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 22 16:30 file2.txt

./dir1:
total 20000
-rw-r--r-- 1 root root 10240000 Mar 22 16:32 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 22 16:32 file2.txt

./dir2:   <--- コピーされたディレクトリ
total 20000
-rw-r--r-- 1 root root 10240000 Mar 22 16:38 file1.txt   <--- ディレクトリ配下もそのままコピーされる
-rw-r--r-- 1 root root 10240000 Mar 22 16:38 file2.txt   <--- ディレクトリ配下もそのままコピーされる
root@localhost:~$ 

-p:パーミッションやタイムスタンプを保持

コピー元のパーミッションやタイムスタンプを保持させることができます。

# <ファイルパス>のパーミッションやタイムスタンプを保持したままコピーする
cp -p <ファイルパス> <ファイルパスorディレクトリパス>

使用例

root@localhost:~$ ls -l 
total 10004
drwxr-xr-x 2 root root     4096 Mar 22 16:32 dir1
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
root@localhost:~$ 
root@localhost:~$ cp -p file1.txt file2.txt 
root@localhost:~$ ls -l
total 20004
drwxr-xr-x 2 root root     4096 Mar 22 16:32 dir1
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file2.txt   <--- タイムスタンプが同じものがコピーされた
root@localhost:~$ 

差分がないのにタイムスタンプなど異なるといったことがあると、あとで調査等で見返した時に不都合になることがあります。

極力このオプションは使う癖をつけておいた方が良いと個人的には思います。

-i:上書き前に確認

コピー先のファイルが既に存在する場合、上書きする前に確認するようにできます。

# 実行時に上書き確認をする
cp -i <ファイルパス> <ファイルパスorディレクトリパス>

使用例

root@localhost:~$ ls -l
total 20004
drwxr-xr-x 2 root root     4096 Mar 22 16:32 dir1
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file2.txt
root@localhost:~$ 
root@localhost:~$ cp -i file1.txt file2.txt 
cp: overwrite 'file2.txt'? y   <--- 上書き確認
root@localhost:~$ 
root@localhost:~$ ls -l
total 20004
drwxr-xr-x 2 root root     4096 Mar 22 16:32 dir1
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 22 16:42 file2.txt
root@localhost:~$ 

実行すると、対話式で「cp: overwrite ‘file2.txt’?」のように聞かれるので、「y」と入力すれば上書きされ、それ以外であれば上書きはされません。

-n:既存ファイルを上書きしない

すでにコピー先に指定したファイルやディレクトリが存在する場合に上書きしないようにできます。

# 指定先filepathと同名のファイルがあった場合に、上書きしない。
cp -n <ファイルパス> <ファイルパスorディレクトリパス>

使用例

root@localhost:~$ ls -lR
.:
total 20004
drwxr-xr-x 2 root root     4096 Mar 22 16:59 dir1
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 22 16:42 file2.txt

./dir1:
total 5000
-rw-r--r-- 1 root root 5120000 Mar 22 16:59 file1.txt
root@localhost:~$ 
root@localhost:~$ cp -n file1.txt dir1/file1.txt 
root@localhost:~$ 
root@localhost:~$ ls -lR
.:
total 20004
drwxr-xr-x 2 root root     4096 Mar 22 16:59 dir1
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 22 16:42 file2.txt

./dir1:
total 5000
-rw-r--r-- 1 root root 5120000 Mar 22 16:59 file1.txt   <--- 上書きされていない
root@localhost:~$ 

-v:コピーの詳細を表示

コマンド実行時にコピーの詳細情報を表示させることができます。

# コピーの詳細情報を表示する
cp -v <ファイルパス> <ファイルパスorディレクトリパス>

使用例

root@localhost:~$ cp -v file1.txt file2.txt 
'file1.txt' -> 'file2.txt'
root@localhost:~$ 

-u:変更されたファイルのみ上書き

すでにコピー先に指定したファイルが存在する場合に、変更されたファイルのみを更新することができます。

# 指定したコピー先に既に存在するfilepathと同名のファイルがあり、そのファイルがfilepathよりも古い場合のみ上書きする。
cp -u <ファイルパス> <ファイルパスorディレクトリパス>

使用例(変更されないケース)

root@localhost:~$ ls -lR
.:
total 20004
drwxr-xr-x 2 root root     4096 Mar 22 16:59 dir1
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 22 16:42 file2.txt

./dir1:
total 5000
-rw-r--r-- 1 root root 5120000 Mar 22 16:59 file1.txt
root@localhost:~$ 
root@localhost:~$ cp -u file1.txt dir1/file1.txt 
root@localhost:~$ 
root@localhost:~$ ls -lR
.:
total 20004
drwxr-xr-x 2 root root     4096 Mar 22 16:59 dir1
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 22 16:42 file2.txt

./dir1:
total 5000
-rw-r--r-- 1 root root 5120000 Mar 22 16:59 file1.txt   <--- 変更されていない
root@localhost:~$ 

使用例(変更されるケース)

root@localhost:~$ ls -lR
.:
total 20004
drwxr-xr-x 2 root root     4096 Mar 22 16:59 dir1
-rw-r--r-- 1 root root 10240000 Mar 21 16:04 file1.txt
-rw-r--r-- 1 root root 10240000 Mar 22 16:42 file2.txt

./dir1:
total 5000
-rw-r--r-- 1 root root 5120000 Mar 22 16:59 file1.txt
root@localhost:~$ 
root@localhost:~$ cp -u dir1/file1.txt file1.txt 
root@localhost:~$ 
root@localhost:~$ ls -lR
.:
total 15004
drwxr-xr-x 2 root root     4096 Mar 22 16:59 dir1
-rw-r--r-- 1 root root  5120000 Mar 22 17:07 file1.txt   <--- 変更されている
-rw-r--r-- 1 root root 10240000 Mar 22 16:42 file2.txt

./dir1:
total 5000
-rw-r--r-- 1 root root 5120000 Mar 22 16:59 file1.txt
root@localhost:~$ 

まとめ

以上です。今回はcpコマンドの基本的な使用方法について紹介しました。

デフォルトで-iオプションをつけるときに使用されるエイリアスについては、別の記事で紹介したいと思います。