「cp」コマンドを使うと、ファイルやディレクトリ(フォルダ)をコピーすることができます。
以下から Linuxコマンド「cp」の具体的な使い方とオプションを解説していきます。
目次
- 1 「cp」コマンドの基本
- 2 「cp」コマンドの応用
- 2.1 複数のファイルをまとめてコピーする
- 2.2 特定の名前が含まれるファイルをまとめてコピーする
- 2.3 -a(–archive)オプション
- 2.4 –attributes-only オプション
- 2.5 -b(–backup)オプション
- 2.6 -d(–no-dereference)オプション
- 2.7 -f(–force)オプション
- 2.8 -H オプション
- 2.9 -i(–interactive)オプション
- 2.10 -l(–link)オプション
- 2.11 -L(–dereference)オプション
- 2.12 -n(–no-clobber)オプション
- 2.13 –no-preserve オプション
- 2.14 -p(–preserve)オプション
- 2.15 -P(–parents)オプション
- 2.16 –preserve オプション
- 2.17 -r、-R(–recursive)オプション
- 2.18 –remove-destination オプション
- 2.19 -s(–symbolic-link)オプション
- 2.20 -S(–suffix)オプション
- 2.21 –sparse オプション
- 2.22 –strip-trailing-slashes オプション
- 2.23 -t(–target-directory)オプション
- 2.24 -T(–no-target-directory)オプション
- 2.25 -u(–update)オプション
- 2.26 -v(–verbose)オプション
- 2.27 -x(–one-file-system)オプション
- 3 まとめ
「cp」コマンドの基本
「cp」は以下のようにコピー元とコピー先のファイル名やディレクトリ名を指定して使います(ディレクトリの場合は -r
オプションをつける必要があります)。
ファイルのコピー
cp コピー元 コピー先
ディレクトリのコピー
cp -r コピー元 コピー先
ファイルをコピーする
コマンドでファイルをコピーを試してみましょう。
まずは以下のコマンドでコピー元になるファイル「file1.txt」を作成してみます。
touch file1.txt
touch コマンドの詳しい使い方はこちら。
それではこの「file1.txt」をコピーして、新たに「file2.txt」を作成してみましょう。コマンドは以下。
cp file1.txt file2.txt
ls コマンドで確認してみると、「file2.txt」が作成されています。
ls
ls コマンドの詳しい使い方はこちら。
ファイルを別のディレクトリ先にコピーする
さきほどは同じディレクトリ内でコピーしましたが、今度は別のディレクトリ先にコピーしてみましょう。
まずは以下のコマンドで「directory1」というディレクトリを用意します。
mkdir directory1
mkdir コマンドの詳しい使い方はこちら。
そして、「directory1」のフォルダの中に「file1.txt」のコピーを「file3.txt」という名前で作成します。コマンドは以下。
cp file1.txt directory1/file3.txt
パスを指定することで、他のディレクトリの中にファイルをコピーすることができました。
パスの詳しい解説はこちら。
また、以下のようにしてコピー先にディレクトリを指定すると、指定されたディレクトリの中に同じ名前でファイルが作成できます。
cp file1.txt directory1
これで「directory1」のフォルダの中に、「file1.txt」のコピーを同じ名前で作成できました。
ディレクトリ(フォルダ)をコピーする
今度はディレクトリ(フォルダ)をコピーしてみましょう。
以下のように -r
オプションをつけると、「directory1」をコピーして、新しく「directory2」のディレクトリ(フォルダ)を作成することができます。
cp -r directory1 directory2
このときディレクトリの中にあるファイルやディレクトリも合わせてコピーされます。
ここまでが「cp」コマンドの基本!
「cp」コマンドの応用
「cp」コマンドの理解をさらに深めたい方は以下もご覧ください。
複数のファイルをまとめてコピーする
半角スペースで区切って複数のファイルを指定することで、それらのファイルをまとめてコピーすることができます。
例えば以下のようにすると、「file1.txt」と「file2.txt」をまとめて「directory1」の中にコピーすることができます。
cp file1.txt file2.txt directory1
特定の名前が含まれるファイルをまとめてコピーする
*
(ワイルドカード)を使うことで、特定の名前が含まれているファイルをまとめてコピーすることができます。
例えば以下のようにすると、末尾に「.txt」がついているファイルだけをまとめて「directory1」にコピーすることができます。
cp *.txt ./directory1
-a(–archive)オプション
-a
オプションをつけると、サブディレクトリ、ファイルモード、所有者情報、属性(パーミッション、オーナー、グループ、タイムスタンプ)などの情報も保持しながらコピーすることができます。
シンボリックリンクも そのままシンボリックリンクとしてコピーされます。
–attributes-only オプション
--attributes-only
オプションを使うと、ファイルのデータはコピーせず、ファイルの属性だけをコピーすることができます。
-b(–backup)オプション
-b
(--backup
)オプションをつけると、コピー先に同じ名前のファイルがある場合は上書きする前に、上書き前のバックアップファイルを作成します。
バックアップファイルを作成するコマンド例
cp -b file1.txt file2.txt
もしコピー先の「file2.txt」がすでに存在している場合は上書きされますが、上書き前のファイルはバックアップとして「file2.txt~」というファイル名で作成されます。
-d(–no-dereference)オプション
通常、コピー元がシンボリックリンク(あるディレクトリに別の場所にあるディレクトリをひも付けて、その名前でアクセスできるようにするしくみ)の場合は、リンク先のファイルをコピーしてシンボリックとしての情報は失われます。
-d
(--no-dereference
)オプションをつけた場合は、シンボリックリンクが そのままシンボリックリンクとしてコピーされます。
-f(–force)オプション
-f
(--force
)オプションをつけると、コピー先に同じ名前のファイルがあっても警告なしで上書きします。
コピー先のファイルが開けない場合は、削除してからコピーします。
-H オプション
-H
オプションをつけると、指定されたファイルのシンボリックリンクを巡ります。
-i(–interactive)オプション
-i
(--interactive
)オプションをつけると、もしコピー先に同じ名前のファイルがあった場合は上書きしても良いか確認を表示させることができます。
「file1.txt」をコピーして「file2.txt」を作成する際、「file2.txt」という名前のファイルがすでに存在していたら上書きしても良いか確認を行うコマンド例
cp -i file1.txt file2.txt
上書きする場合は yes
や y
、しない場合は no
や n
を入力します。
-l(–link)オプション
-l
(--link
)オプションをつけると、ファイルのコピーを行う代わりにファイルのハードリンク(ファイルに別の名前を設定し、そこからアクセスできるしくみ)を作成します。
-L(–dereference)オプション
-L
(--dereference
)オプションをつけると、コピー元がシンボリックリンク(あるディレクトリに別の場所にあるディレクトリをひも付けて、その名前でアクセスできるようにするしくみ)の場合は、シンボリックリンクが指しているファイルやディレクトリをコピーします。
-n(–no-clobber)オプション
-n
(--no-clobber
)オプションをつけると、コピー先にすでに同じ名前のファイルやディレクトリが存在している場合は上書きしません。
–no-preserve オプション
--no-preserve
オプションをつけると、指定した属性を保持せずにコピーします。
以下のような属性を指定することができます。
all | すべて |
timestamps | タイムスタンプ |
ownership | 所有者、所有グループ |
mode | パーミッション |
context | コンテキスト |
links | ハードリンク |
xattr | ファイルシステムの拡張属性 |
「file1.txt」から「file2.txt」をタイムスタンプとパーミッションを保持せずにコピーするコマンド例
cp --no-preserve=timestamps,mode file1.txt file2.txt
-p(–preserve)オプション
-p
(--preserve
)オプションをつけると、所有者、所有グループ、パーミッション、タイムスタンプを保持してコピーできます。
-P(–parents)オプション
-P
(--parents
)オプションをつけると、コピー元にあるシンボリックリンク(あるディレクトリに別の場所にあるディレクトリをひも付けて、その名前でアクセスできるようにするしくみ)を辿りません。
シンボリックリンクをシンボリックリンクとしてコピーします。
–preserve オプション
--preserve
オプションをつけると、指定した属性を保持してコピーします。
以下のような属性を指定することができます。
all | すべて |
timestamps | タイムスタンプ |
ownership | 所有者、所有グループ |
mode | パーミッション |
context | コンテキスト |
links | ハードリンク |
xattr | ファイルシステムの拡張属性 |
「file1.txt」から「file2.txt」をタイムスタンプと所有者、所有グループを保持してコピーするコマンド例
cp --preserve=timestamps,ownership file1.txt file2.txt
-r、-R(–recursive)オプション
-r
や -R
(--recursive
)オプションをつけると、コピー元にディレクトリを指定した場合はディレクトリの中身も含めて丸ごとコピーします。
–remove-destination オプション
--remove-destination
オプションをつけると、コピー先にファイルが存在する場合、ファイルを削除してからコピーします。
-s(–symbolic-link)オプション
-s
(--symbolic-link
)オプションをつけると、ファイルのコピーを行う代わりにファイルのシンボリックリンク(あるディレクトリに別の場所にあるディレクトリをひも付けて、その名前でアクセスできるようにするしくみ)を作成します。
-S(–suffix)オプション
-S
(--suffix
)オプションを使うと、-b
(--backup
)オプションで作成されるバックアップファイルの名前の後ろにつく文字列を指定することができます。
バックアップファイルの名前の後ろにつく文字列を「_copy」に指定するコマンド例
cp -b -S _copy file1.txt file2.txt
もしコピー先の「file2.txt」がすでに存在している場合は、バックアップファイルとして「file2.txt_copy」が作成されます。
バックアップファイルの名前の後ろにつく文字列を今日の日付に指定するコマンド例
cp -b -S _$(date +%Y%m%d) file1.txt file2.txt
もしコピー先の「file2.txt」がすでに存在している場合は、バックアップファイルとして「file2.txt_20180101」のように今日の日付がついたファイルが作成されます。
–sparse オプション
--sparse
オプションをつけると、コピー先のファイルをスパースファイル(ファイルの大部分が空である場合に、ディスク領域を減らすために書き込まれた領域だけを確保しているファイル)にするか指定することができます。
オプションには以下を指定することができます。
auto | コピー元がスパースファイルの場合は、コピー先のファイルもスパースファイルにする |
always | コピー先のファイルをスパースファイルする |
never | コピー先のファイルはスパースファイルにしない |
コピー先のファイルをスパースファイルにするコマンド例
cp --sparse=always file1.txt file2.txt
–strip-trailing-slashes オプション
--strip-trailing-slashes
オプションをつけると、コピー元のファイルやディレクトリの名前の末尾に「/」がついている場合、「/」を削除した名前でコピーします。
-t(–target-directory)オプション
-t
(--target-directory
)オプションをつけると、オプションで指定したディレクトリにコピーします。
-T(–no-target-directory)オプション
通常はコピー先がディレクトリだった場合、そのディレクトリの中にファイルをコピーすることになりますが、-T
(--no-target-directory
)オプションをつけると、コピー先の対象として、指定した名前にコピーされます。
例えば以下のコマンドで、「directory1」という名前のディレクトリが「directory2」という名前のディレクトリの下にコピーされます。
cp -r directory1 directory2
それに対して以下のように -T
(--no-target-directory
)オプションをつけた場合、「directory1」のディレクトリの中にあるファイルが、「directory2」のディレクトリの中にコピーされます。
cp -rT directory1 directory2
-u(–update)オプション
-u
(--update
)オプションをつけると、コピー先に同じ名前のファイルが存在していた際に、そのファイルのタイムスタンプがコピー元のファイルより新しいか同じだったらコピーしません。
-v(–verbose)オプション
-v
(--verbose
)オプションをつけると、コピーを行う際の情報を表示します。
以下のようにコピーしたファイルの情報が表示されます。
-x(–one-file-system)オプション
-x
(--one-file-system
)オプションをつけると、このファイルシステムのみで実行されます。
別のファイルシステムにあるサブディレクトリはコピーを行いません。
まとめ
以上、Linuxコマンド「cp」の使い方でした!
ここまでの内容をまとめておきます。
- 「cp」コマンドでファイルやディレクトリ(フォルダ)をコピーすることができる。
- ディレクトリ(フォルダ)をコピーする際は、
-r
オプションをつける。 - コピー元やコピー先はパスで指定できる。