server-memo.net

cpコマンドの使い方

   

linuxでのcpコマンドの使い方です。

cpコマンド

cpコマンドはlinuxでファイルやフォルダなどをコピーするためのコマンドです。

書式

cp [オプション] [コピー元] [コピー先]

オプション

他にもまだアリアますが普段使いそうなものだけピックアップしてます。

オプション 内容
-b, --backup コピー先がすでに存在していた場合にコピー先をバックアップする
-i コピーを行う際に確認をする
-f 制的にコピーを実施する
-p コピー元の「ユーザ名」「更新日時」「パーミッション」といったファイル情報をそのままコピーする
-R, -r, --recursive ディレクトリをコピーするときに使用。ディレクトリ内ある全てのデータをコピーする
-v コピーするファイルを表示しながらコピーする

使い方

オプションについての解説です。

基本の使い方

オプションを指定せずに「test1」というファイルを「test2」としてコピーしました。

この場合コピー先のファイルは、コピーが作成された時刻のタイムスタンプとなります。

$ cp test1 test2
$ ll
total 8
-rw-rw-r-- 1 tamohiko tamohiko 11 Jun  7 09:53 test1
-rw-rw-r-- 1 tamohiko tamohiko 11 Jun  7 09:55 test2

他のユーザがオーナーのファイルをコピーした場合

オーナーが「tamohiko」であるファイル「test1」を「root」ユーザでコピーしてみました。

この場合、コピー先のファイルは「root」ユーザがオーナーとなり、タイムスタンプやパーミッションも変更されてしまうことが分かります。

# cp test1 test3
# ls -l
合計 16
-rw-rw-r--. 1 tamohiko tamohiko 5  6月  7 19:18 test1
-rw-r--r--. 1 root     root     5  6月  8 15:29 test3

上書きの確認を行う(-i オプション)

「-i」オプションをつけて「cp」コマンドを実行すると、コピー先に同名のファイルがあると上書きして良いか確認のメッセージが表示されます。

実行例

すでに「test2」というファイルがある状態でコピーを行った時には、下記のようなメッセージが表示されて、上書きしてよいか確認してきます。

$ cp -i test1 test2
cp: overwrite ‘test2’? y

環境変数LANGの設定によりメッセージが日本語だったり、英語だったりします。

$ cp -i test1 test2
cp: `test2' を上書きしますか? y

ファイル情報をそのままでコピー(-p オプション)

「-p」オプションを付けることで、ファイルが持っている「オーナー情報」や「パーミッション」「タイムスタンプ」等の情報そのままでコピーをすることが出来ます。

実行例

「-p」オプションを指定することによって、コピー元とコピー先のタイムスタンプが同じになりました。

$ cp -p test1 test2
$ ll
total 8
-rw-rw-r-- 1 tamohiko tamohiko 11 Jun  7 09:53 test1
-rw-rw-r-- 1 tamohiko tamohiko 11 Jun  7 09:53 test2
他のユーザがオーナーのファイルをコピーした場合

オーナーが「tamohiko」であるファイル「test1」を「root」ユーザでコピーしてみました。

# cp -p test1 test3
# ls -l
合計 16
-rw-rw-r--. 1 tamohiko tamohiko 5  6月  7 19:18 test1
-rw-rw-r--. 1 tamohiko tamohiko 5  6月  7 19:18 test3

「-p」オプションを付けているので、コピー元ファイルと同じ「オーナー情報」「パーミッション」「タイムスタンプ」でファイルをコピーできている事が分かります。

ディレクトリのコピー(-R オプション)

ディレクトリをコピーする場合は、「-R」オプションを指定する必要があります。( -r や --recursiveでも良いです)

実行例

「test_dir」の中にはファイルが2個入っています。

$ ls -l test_dir/
total 8
-rw-rw-r--. 1 tamohiko tamohiko 5 Jun  7 19:18 test1
-rw-rw-r--. 1 tamohiko tamohiko 5 Jun  7 19:19 test2

「test_dir」というディレクトリを「test_dir2」と名前のディレクトリとしてコピーしました。

$ cp -R test_dir/ test_dir2

コピー先の「test_dir2」ディレクトリの中身を確認すると、中にファイルも無事コピーされていることが確認できました。

$ ls -l test_dir2
total 8
-rw-rw-r--. 1 tamohiko tamohiko 5 Jun  7 19:24 test1
-rw-rw-r--. 1 tamohiko tamohiko 5 Jun  7 19:24 test2
「-R」オプションを付けずにフォルダをコピーした場合

「-R」オプションを付けないと、「cp: omitting directory ‘ディレクトリ名’」とか「cp: ディレクトリ `ディレクトリ名' を省略しています」といったメッセージが表示されてコピーに失敗します。

実行例

「-R」オプションを指定しないでディレクトリをコピーし、コピーに失敗した際の例です。

$ cp test test2
cp: ディレクトリ `test' を省略しています

環境変数LANGの設定によっては、メッセージは日本語だったり英語だったりします。

$ cp test/ test2
cp: omitting directory ‘test/’

コピー先に同じ名前のディレクトリがある場合

コピー先に指定したディレクトリが既に存在する場合はどうなるのでしょう?

ファイルの場合は上書きされましたが、ディレクトリの場合はそのディレクトリの中にコピー元のディレクトリがコピーされます。

実行例

事前に「test_dir2」という中が空っぽのディレクトリを作成します。

$ mkdir test_dir2
$ ls -l test_dir2
total 0

「test_dir」ディレクトリのコピー先に「test2_dir」を指定して、コピーを実行します。

$ cp -R test_dir test_dir2

「test_dir2」の中身を確認すると、「test_dir」フォルダ事コピーされていることが確認できます

$ ls -l test_dir2/
total 0
drwxrwxr-x. 2 tamohiko tamohiko 30 Jun  8 16:45 test_dir
フォルダ内のデータだけをコピーしたいときは?

では、コピー元ディレクトリ内のデータだけを、コピー先のディレクトリ内にコピーしたい場合はどうすれば良いのでしょうか?

この場合は、コピー元のディレクトリ内にあるファイルを「*」等で指定することで、コピー元ディレクトリ内のデータをコピー先のディレクトリにコピーすることが出来ます。

実行例

コピー元ディレクトリ内のデータを「*」で指定して、すでに存在している「test_dir2」にコピーをしてみます。

$ cp -R test_dir/* test_dir2

「test_dir」内のデータだけが(test_dirディレクトリ自体は含まずに)「test_dir2」にコピーされたことが確認できます。

$ ls -l test_dir2
total 8
-rw-rw-r--. 1 tamohiko tamohiko  5 Jun  8 16:53 test1
-rw-rw-r--. 1 tamohiko tamohiko  5 Jun  8 16:53 test2

コピーするファイルを表示(-v オプション)

「-v」オプションを指定すると、コピーするファイルの詳しい状況が表示されます。

実行例

このように、どのファイルがどこにコピーされたかの情報が表示されます。

$ cp -Rv test_dir test_dir2
`test_dir' -> `test_dir2'
`test_dir/test1' -> `test_dir2/test1'
`test_dir/test2' -> `test_dir2/test2'

強制的にコピー(-f オプション)

注意!!

-fオプションを指定して作業する場合、操作を失敗すると必要なファイルが無くなってしまったりする場合もあるので、使用の際は十分に確認を行ってから作業をしてください。

実行例

「test2」ファイルのパーミッションが読み込みのみであるときに、「test1」から「test2」にコピーを行ってみます。

$ ll
合計 8
-rw-rw-r--. 1 tamohiko tamohiko 5  6月  7 19:18 test1
-r--------. 1 tamohiko tamohiko 5  6月  7 20:31 test2

「test1」から「test2」にコピーを行うと、許可がないといって上書きができません。

$ cp test1 test2
cp: 通常ファイル `test2' を作成できません: 許可がありません
$ cp test1 test2
cp: cannot create regular file 'test2': Permission denied

「-f」オプションを指定してコピーを行うと、強制的にコピーが行われます。

$ cp -f test1 test2
$ ls -l
合計 8
-rw-rw-r--. 1 tamohiko tamohiko 5  6月  7 19:18 test1
-rw-rw-r--. 1 tamohiko tamohiko 5  6月  9 00:41 test2

※他のユーザがオーナーのファイルで、コピーしようするユーザに書き込み権限が無い場合は、「-f」オプションをつけても上書きはできません。(rootユーザを除く)

-fオプションが効かない場合

CentOS等の一部ディストリビューションでは、rootユーザの「.bashrc」に初期設定で「cp」コマンドのエイリアスとして「cp -i」が設定されていて、上書きの確認が毎回表示されます。

.bashrc内容抜粋
alias cp='cp -i'

この場合「-f」オプションを指定しても上書き確認のメッセージが表示されてしまいます。

# cp -f test test1
cp: `test1' を上書きしますか? y

「-f」を有効にして上書き確認のメッセージを表示させたくない場合は、「cp」コマンドの前にバックスラッシュ「\」を付けるとエイリアスが無効になり、「-f」オプションが有効となります。

# \cp -f test test1

他に「-f」オプションを有効化する方法としては、「unalias」コマンドでエイリアスの設定を無効化する方法と、「.bashrc」を編集してエイリアスの設定を削除してしまう方法があります。

unaliasコマンドで「-f」オプションを有効化
# unalias cp
.bashrcを編集して「-f」オプションを有効化

.bashrcを編集してaliasの設定を削除して、ログインしなおせばエイリアスの設定がなくなります。(この方法はおすすめしません…)

バックアップ(-b オプション)

「-b」オプションを指定すると、コピー先にすでにファイルがある場合バックアップをとってくれます。

$ cp -b test1 test2

~チルダ付きのファイルがバックアップが作成されていることがわかります。

$ ls -l
total 12
-rw-rw-r--. 1 tamohiko tamohiko 5 Jun  7 19:18 test1
-rw-rw-r--. 1 tamohiko tamohiko 5 Jun  7 20:31 test2
-rw-rw-r--. 1 tamohiko tamohiko 5 Jun  7 19:31 test2~

「cp」コマンドのバックアップ機能について説明すると、j非常に長くなってしまいますので、別のページで今度説明することにします。

 - cp