Linuxを使っている限り必ず使うのがcpコマンドだ。ファイルやディレクトリをコピーするのに使う。
本日はLinuxのcpコマンドの使い方について詳しく解説した。
知っているオプションも多いだろうが、意外と知られていない便利なオプションについてもまとめている。
Linuxを使うエンジニアは参考にして頂ければと思う。
ファイルやディレクトリをコピーするcpコマンドの基本
通常のコピー
cpコマンドはcopyの略で、そのままファイルをコピーするためのコマンドだ。基本的な書式は次のようになる。
$ cp コピー元 コピー先
例えば次のような形だ。
$ cp fileA.txt fileA_copy.txt
これでコピーが完了する。
もちろん別のディレクトリにもコピーはできる。次の例はdirディレクトリにコピー先を指定している。
$ cp fileA.txt dir/fileA_copy.txt
ここまでは基本の基本ということで、使い方で知っている方も多いだろう。
ファイル名をそのままにコピー
ファイル名を変更せず同じ名前としてコピーする場合、コピー先にはディレクトリ名を書くだけでよい。
$ cp コピー元 コピー先のディレクトリ名
これだけでコピーができる。次のような形だ。dirディレクトリの中にfileA.txtをコピーしている。
$ cp fileA.txt dir
複数ファイルをコピー
これは知らない方も多いと思うが、複数ファイルに同時にコピーすることもできる。上と同じようにファイル名を同じにして、ディレクトリに保存する。
$ cp コピー元その1 コピー元その2 コピー先のディレクトリ名
$ cp fileA.txt fileB dir
このように2つのファイルを同時にコピーできた。
ワイルドカードでコピー
ワイルドカードを使って一度にコピーすることもできる。次のような形だ。
$ cp file* ディレクトリ名
こちらも意外によく使える。覚えておいて損はない。
cpコマンドの便利なオプションたち
cpコマンドのオプション一覧
特に便利なものを後からピックアップしてご紹介するが、まずは一覧でご紹介しよう。
-a | 元ファイルの属性とディレクトリの構成を保持してコピーする。可能な限り。 |
-b | 上書きされるファイルのバックアップを作成する |
-d | シンボリックリンクをコピーする時は実体をコピーする |
-f | コピー先に同じ名前のファイルがあっても警告なしで上書きをする。 |
-i | 上書きされるファイルがある場合、確認が入る。 |
-l | ハードリンクを作成する |
-P | ディレクトリをつけてコピーする |
-p | 元のファイルのオーナー、グループ、パーミション、タイムスタンプを保持 |
-r | ディレクトリごとコピーする(再帰的) |
-s | シンボリックリンクを作成する |
-u | 保存先が同じファイル名のファイルだったとき、タイムスタンプを確認して、新しいor同じだったときコピーしない。 |
-v | コピーの詳細情報を表示 |
これらがcpコマンドのオプションだ。便利なものだけピックアップしてご紹介していく。
-r オプション:ディレクトリごとコピー
cpコマンドの中で、もっともよく使うオプションが、この「-r」オプションだろう。
-rオプションをつけることにより、ディレクトリごとコピーすることができる。ディレクトリの中のファイルもコピーの対象だ。
$ cp -r コピー元ディレクトリ コピー先ディレクトリ
-fオプション:強制的にコピー
ディストリビューションごとに違うのだが、コピー先に同じ名前のファイルがある場合に確認が入ることがある。
いちいちそれに答えるのが面倒な場合、使えるのが「-f」コマンドだ。forceの名の下に、強制的に上書きをする。
-iオプション:上書きになるときは要確認
-fオプションとは反対に、上書きになるかを確認したいときもある。大事なファイルを扱っているときには、上書きは致命傷になる。
$ cp -i ファイル元 コピー後
で「yes or no」の確認が出る。
最近のディストリビューションではこちらがデフォルトになっていることもある。設定されていない場合にはエイリアスで設定しておいてもいいだろう。
-bオプション(--backup):上書き時にバックアップファイルを作成
大事なファイル群を扱っているとき、上書きをするのはやはり怖い。その際に使えるのが「-b」オプションだ。
-bオプションを利用すると、cpコマンドを実行すると同時にバックアップファイルを作ってくれる。
最後に、「~」がついたファイルがバックアップされたファイルだ。自動的に生成してくれるのは頼もしい。
バックアップ時に後ろにつける文字列は「~」だけではなく、指定することも可能だ。--suffixオプションを使う。
$ cp -b --suffix=_$(date +%Y%m%d) コピー元 コピー先
とすると、「_20180129」というように今日の日付を後ろにつけることができる。バックアップとしてはこちらの方がわかりやすくていい。
また、numberedなどを利用すると、番号をつけることもできる。詳細はhelpを確認してみよう。
-sオプション(--symbolic-link):シンボリックリンクの作成
通常シンボリックリンクを作成する時は、lnコマンドを使って
$ ln -s 元ファイル シンボリックリンク
と書く。実はcpコマンドでもこれができる。-sコマンドを利用する方法だ。
$ cp -s 元ファイル シンボリックリンク
で、実は作成できる。
-lオプション:ハードリンクを作成
同じように「-l」オプションを利用すると、ハードリンクが作成できる。「ls -il」コマンドで確認すると、i-nodeが同じことを確認できる。
-vオプション:コピーの情報を表示
-vオプションを利用すると、何がコピーされたかの情報を表示してくれる。ワイルドカードを使ったときなど、付けておくと便利だ。
-Pオプション(--parents):ディレクトリ構造ごとコピーする
通常のcpコマンドではサブディレクトリも含めた状態でコピーすることはできない。そういうときには「-P」オプションを利用する。
下記の例でオプションなしで実行すると、普通はfileC.txtがdirディレクトリに入るだけになる。--parentsオプションを使うことで、ディレクトリ構造をそのままコピーできているのがわかるだろう。
CPコマンドと類似のコマンド群
最後に、cpと似ているコマンドもご紹介しておこう。
mvコマンド
moveで移動のコマンド。名前を変えるときにも使う。cpと同じくファイル、ディレクトリに関する重要コマンドだ。
rsync
高速なファイルの同期やバックアップに使うコマンドだ。コピー元とコピー先で差分(違いのみ)をコピーできる点でcpよりも早く動く。
本番サーバーへの移行やバックアップに使われることが多い。
install
ファイルをコピーし、その属性を設定するinstallコマンドというものもある。インストール作業に便利なコマンドで、設定時などに使うといいだろう。
それぞれ、使える場面があるので、興味があるコマンドは調べてみることをオススメする。
まとめ
コピーコマンドについて、普段使わないオプションも含めてまとめてみた。いかがだっただろうか? -bオプションなどは便利だが、「知らなかった」という方も多かったのではないだろうか?
このようにcpコマンドにも様々に便利な使用方法がある。引き続き、様々なコマンドの詳細をお伝えしていくので、参考にして頂ければと思う。
ファイル名を入力しなくて済むので、早く作業が終わる。
ファイル名の入力と作業時間のバーターではない。
ファイル名を「変えない」選択とも考えられないか?
ご指摘いただきありがとうございます。
該当箇所の記述を訂正いたしました。
引き続き、ご愛読のほど、よろしくお願いいたします。