効率よく結果を出す法則とは……?

Linuxコマンド「cp」とオプションの使い方(ファイルやディレクトリ・フォルダをコピーする)

「cp」コマンドを使うと、ファイルやディレクトリ(フォルダ)をコピーすることができます。

以下から Linuxコマンド「cp」の具体的な使い方とオプションを解説していきます。

 

「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

上書きする場合は yesy 、しない場合は non を入力します。

 

-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 オプションをつける。
  • コピー元やコピー先はパスで指定できる。