cpコマンド : ファイルをコピー

Linuxコマンド(ファイル/ディレクトリ管理)
2023-09-23
ヒーローイメージ

目次
  1. コマンド概要
  2. コマンド書式
  3. コマンド使用例

コマンド概要

  • cpコマンドは1つ以上のファイルやディレクトリをコピーするコマンドです。

  • コピー先ディレクトリを指定した場合は、ファイルはディレクトリ配下にコピーされます。

コマンド書式

コマンド書式
cp [オプション] コピー元ファイル名 コピー先ファイル名
cp [オプション] コピー元ファイル名 コピー先ディレクトリ名
オプション 説明

-a
--archive

ファイル構成やアクセス権限を保持してディレクトリを再帰的にコピーします。

-b
--backup

コピー前にコピー先ファイルをバックアップしてからコピーを実行します。

-i
--interactive

コピー先に同名のファイルが存在する場合はファイルを上書きするかを確認します。

-L
--dereference

コピー先にあるファイルがシンボリックリンクの場合、シンボリック元を上書きする。

-P
--no-dereference

シンボリックリンクをシンボリックリンクとしてコピーする。

-p
--preserve

コピー元ファイルのパーミッションやアクセス時間もコピーする。

-r
--recursive

コピー元ディレクトリを再帰的にコピーする。

-S 文字列
--suffix=文字列

(コピー先にファイルが存在する場合)コピー先ファイルの末尾に指定した文字列を付与したバックアップファイルを作成してからコピーする。

-s
--symbolic-link

コピー先にシンボリックリンクを作成する。

-t 文字列
--target-directory=文字列

コピー先ディレクトリ(=文字列)を指定する。

-u
--update

コピー先に同一ファイル名が既に存在し、最終更新時間がコピー元ファイルより古い場合のみコピーを実行します。

-v
--verbose

コマンドの実行詳細を出力する。

コマンド使用例

動作確認環境
項目 補足
OS Amazon Linux 2
シェル bash 4.2.46
コマンド cp (GNU coreutils) 8.22
PS1 [\u@\h \W]$ プロンプト表示形式は [ユーザ名@ホスト名 カレントディレクトリ名]ユーザ権限
PS2 > 継続行のプロンプト表示形式

cp : ファイルコピー

  • cpコマンドを使用すると1つ以上のファイルやディレクトリをコピーすることができます。

    コマンド例
    // テスト用ファイル作成
    [username@hostname ~]$ echo 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.' > tempfile1
    
    
    // ファイル状態(コピー前)
    [username@hostname ~]$ ls -l tempfile*
    -rw-r--r-- 1 username groupname 58 Sep 23 00:00 tempfile1
    
    // ファイルコピー実行(tempfile1 から tempfile2 をコピー)
    [username@hostname ~]$ cp tempfile1 tempfile2
    
    // ファイル状態(コピー後)
    [username@hostname ~]$ ls -l tempfile*
    -rw-r--r-- 1 username groupname 58 Sep 23 00:00 tempfile1
    -rw-r--r-- 1 username groupname 58 Sep 23 00:01 tempfile2
    
    

cp -a : ファイル属性保持コピー

  • -aオプションを使用するとコピー時にファイル構成やアクセス権限を変更せずにディレクトリを再帰的にコピーすることができます。

    コマンド例
    // テスト用ファイル作成
    [username@hostname ~]$ mkdir tempdir1
    [username@hostname ~]$ for i in `seq 1 3`
    > do
    >   echo 'Lorem ipsum dolor sit amet.' > "tempdir1/tempfile$i"
    > done
    
    // ファイル状態(コピー元)
    [username@hostname ~]$ ls -l tempdir1/tempfile*
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir1/tempfile1
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir1/tempfile2
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir1/tempfile3
    
    // ユーザ切り替え+カレントディレクトリ変更
    [vagrant@hostname ~]$ sudo su - ; cd ~username
    
    
    // 通常のコピー実行
    [root@hostname username]# cp -r tempdir1/ tempdir2/
    
    
    // ファイル状態(通常コピー実行後)
    // →所有者や時刻に変更あり
    [root@hostname username]# ls -l tempdir2/tempfile*
    -rw-r--r-- 1 root root 28 Sep 23 00:05 tempdir2/tempfile1
    -rw-r--r-- 1 root root 28 Sep 23 00:05 tempdir2/tempfile2
    -rw-r--r-- 1 root root 28 Sep 23 00:05 tempdir2/tempfile3
    
    // ファイル属性を変更せずコピー実行
    [root@hostname username]# cp -a tempdir1/ tempdir3/
    
    // ファイル状態(ファイル属性変更なしコピー実行後)
    // →所有者や時刻に変更なし
    [root@hostname username]# ls -l tempdir3/tempfile*
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir3/tempfile1
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir3/tempfile2
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir3/tempfile3
    
    

cp -i : 上書きコピー確認

  • -iオプションを使用するとコピー先に同名ファイルが存在する場合はファイルを上書きするかを確認します。

    コマンド例
    // テスト用ファイル作成
    [username@hostname ~]$ echo 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.' > tempfile1
    [username@hostname ~]$ echo 'Consectetur adipiscing elit.' > tempfile2
    
    // ファイル状態(コピー前)
    [username@hostname ~]$ ls -l tempfile*
    -rw-r--r-- 1 username groupname 58 Sep 23 00:00 tempfile1
    -rw-r--r-- 1 username groupname 29 Sep 23 00:00 tempfile2
    
    // ファイルコピー実行(コピー先ファイルが既に存在する)
    [username@hostname ~]$ cp -i tempfile1 tempfile2cp: overwrite ‘tempfile2’? // yes か no を入力する
    
    

cp -L : シンボリックリンク元上書き

  • -Lオプションを使用するとコピー先にあるファイルがシンボリックリンクの場合にシンボリック元を上書きします。

    コマンド例
    // テスト用ファイル作成
    [username@hostname ~]$ echo 'Lorem ipsum dolor sit amet.' > tempfile1
    [username@hostname ~]$ echo 'Consectetur adipisicing elit.' > tempfile2
    [username@hostname ~]$ cp -s tempfile1 tempfile1-link
    
    // ファイル状態(コピー前)
    [username@hostname ~]$ ls -l tempfile*
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempfile1
    lrwxrwxrwx 1 username groupname  9 Sep 23 00:00 tempfile1-link -> tempfile1
    -rw-r--r-- 1 username groupname 30 Sep 23 00:00 tempfile2
    
    // シンボリックリンク元を上書きコピー
    [username@hostname ~]$ cp -L tempfile2 tempfile1-link
    
    // ファイル状態(コピー後)
    [username@hostname ~]$ ls -l tempfile*
    -rw-r--r-- 1 username groupname 30 Sep 23 00:00 tempfile1
    lrwxrwxrwx 1 username groupname  9 Sep 23 00:00 tempfile1-link -> tempfile1
    -rw-r--r-- 1 username groupname 30 Sep 23 00:00 tempfile2
    
    

cp -P : シンボリックリンクコピー

  • -Pオプションを使用するとシンボリックリンクをシンボリックリンクとしてコピーします。

    コマンド例
    // テスト用ファイル作成
    [username@hostname ~]$ echo 'Lorem ipsum dolor sit amet.' > tempfile1
    [username@hostname ~]$ cp -s tempfile1 tempfile1-link1
    
    // ファイル状態(コピー前)
    [username@hostname ~]$ ls -l tempfile*
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempfile1
    lrwxrwxrwx 1 username groupname  9 Sep 23 00:00 tempfile1-link1 -> tempfile1
    
    // 通常のコピー実行
    [username@hostname ~]$ cp tempfile1-link1 tempfile1-link2
    
    
    // ファイル状態(通常コピー後)
    // →シンボリックをコピーした場合はシンボリック先ファイルがコピーされる
    [username@hostname ~]$ ls -l tempfile*
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempfile1
    lrwxrwxrwx 1 username groupname  9 Sep 23 00:00 tempfile1-link1 -> tempfile1
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempfile1-link2
    
    // シンボリックリンクとしてコピー
    [username@hostname ~]$ cp -P tempfile1-link1 tempfile1-link3
    // ファイル状態(シンボリックリンクコピー後)
    // →シンボリックがコピーされる
    [username@hostname ~]$ ls -l tempfile*
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempfile1
    lrwxrwxrwx 1 username groupname  9 Sep 23 00:00 tempfile1-link1 -> tempfile1
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempfile1-link2
    lrwxrwxrwx 1 username groupname  9 Sep 23 00:00 tempfile1-link3 -> tempfile1
    
    

cp -r : ディレクトリ再帰的コピー

  • -rオプションを使用するとコピー元ディレクトリを再帰的にコピーします。

    コマンド例
    // テスト用ファイル作成
    [username@hostname ~]$ mkdir tempdir1
    [username@hostname ~]$ for i in `seq 1 3`
    > do
    >   echo 'Lorem ipsum dolor sit amet.' > "tempdir1/tempfile$i";
    > done
    
    // ファイル状態(コピー前)
    [username@hostname ~]$ ls -l tempdir1/tempfile* tempdir2/tempfile*
    ls: cannot access tempdir2/tempfile*: No such file or directory
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir1/tempfile1
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir1/tempfile2
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir1/tempfile3
    
    // 通常のコピー実行→失敗
    [username@hostname ~]$ cp tempdir1/ tempdir2/
    cp: omitting directory ‘tempdir1/// ディレクトリコピー実行
    [username@hostname ~]$ cp -r tempdir1/ tempdir2/
    
    // ファイル状態(コピー後)
    [username@hostname ~]$ ls -l tempdir1/tempfile* tempdir2/tempfile*
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir1/tempfile1
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir1/tempfile2
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir1/tempfile3
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir2/tempfile1
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir2/tempfile2
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempdir2/tempfile3
    
    

cp -S : バックアップ後コピー

  • -Sオプションを使用するとコピー先ファイルの末尾に指定した文字列を付与したバックアップファイルを作成してからコピーします。

    コマンド例
    // テスト用ファイル作成
    [username@hostname ~]$ echo 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.' > tempfile1
    [username@hostname ~]$ touch tempfile2
    
    // ファイル状態(コピー前)
    [username@hostname ~]$ ls -l tempfile*
    -rw-r--r-- 1 username groupname 58 Sep 23 00:00 tempfile1
    -rw-r--r-- 1 username groupname  0 Sep 23 00:05 tempfile2
    
    // コピー先ファイルをバックアップしてからコピー実行
    [username@hostname ~]$ cp -S .org tempfile1 tempfile2
    
    // ファイル状態(コピー後)
    [username@hostname ~]$ ls -l tempfile*
    -rw-r--r-- 1 username groupname 58 Sep 23 00:00 tempfile1
    -rw-r--r-- 1 username groupname 58 Sep 23 00:10 tempfile2
    -rw-r--r-- 1 username groupname  0 Sep 23 00:05 tempfile2.org
    
    

cp -s : シンボリックリンク作成

  • -sオプションを使用するとコピー先にシンボリックリンクを作成します。

    コマンド例
    // テスト用ファイル作成
    [username@hostname ~]$ echo 'Lorem ipsum dolor sit amet.' > tempfile1
    
    
    // ファイル状態(作成前)
    [username@hostname ~]$ ls -l tempfile*
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempfile1
    
    // シンボリックを作成
    [username@hostname ~]$ cp -s tempfile1 tempfile-link
    
    // ファイル状態(作成後)
    [username@hostname ~]$ ls -l tempfile*
    -rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempfile1
    lrwxrwxrwx 1 username groupname  9 Sep 23 00:00 tempfile-link -> tempfile1
    
    

cp -t : ディレクトリ指定コピー

  • -tオプションを使用するとコピー先ディレクトリを指定してコピーすることができます。

    コマンド例
    // テスト用ファイル作成
    [username@hostname ~]$ mkdir tempdir1
    [username@hostname ~]$ echo 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.' > tempfile1
    
    // ファイル状態(コピー前)
    [username@hostname ~]$ ls -l tempdir1/tempfile1
    ls: cannot access tempdir1/tempfile1: No such file or directory
    
    // ディレクトリ指定コピー実行
    [username@hostname ~]$ cp -t tempdir1 tempfile1
    
    // ファイル状態(コピー後)
    [username@hostname ~]$ ls -l tempdir1/tempfile1
    -rw-r--r-- 1 username groupname 58 Sep 23 00:00 tempdir1/tempfile1
    
    

cp -u : 古い場合のみコピー

  • -uオプションを使用するとコピー先に同一ファイル名が既に存在し、最終更新時間がコピー元ファイルより古い場合のみコピーします。
コマンド例
// テスト用ファイル作成
[username@hostname ~]$ echo 'Lorem ipsum dolor sit amet.' > tempfile1
[username@hostname ~]$ echo 'Consectetur adipiscing elit.' > tempfile2
[username@hostname ~]$ echo 'Sed do eiusmod tempor incididunt.' > tempfile3

// ファイル状態(コピー前)
[username@hostname ~]$ ls -l tempfile*
-rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempfile1
-rw-r--r-- 1 username groupname 29 Sep 23 00:05 tempfile2
-rw-r--r-- 1 username groupname 34 Sep 23 00:10 tempfile3

// 更新日時が新しいファイルへコピー実行(コピーされない)
[username@hostname ~]$ cp -u tempfile2 tempfile3

// ファイル状態
[username@hostname ~]$ ls -l tempfile*
-rw-r--r-- 1 username groupname 28 Sep 23 00:00 tempfile1
-rw-r--r-- 1 username groupname 29 Sep 23 00:05 tempfile2
-rw-r--r-- 1 username groupname 34 Sep 23 00:10 tempfile3

//  更新日時が古いファイルへコピー実行
[username@hostname ~]$ cp -u tempfile2 tempfile1

// ファイル状態(コピー後)
[username@hostname ~]$ ls -l tempfile*
-rw-r--r-- 1 username groupname 29 Sep 23 00:05 tempfile1
-rw-r--r-- 1 username groupname 29 Sep 23 00:05 tempfile2
-rw-r--r-- 1 username groupname 34 Sep 23 00:10 tempfile3

cp -v : コピー実行詳細出力

  • -vオプションを使用するとコマンドの実行詳細を出力してコピーします。
コマンド例
// テスト用ファイル作成
[username@hostname ~]$ echo 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.' > tempfile1


// ファイル状態(コピー前)
[username@hostname ~]$ ls -l tempfile*
-rw-r--r-- 1 username groupname 58 Sep 23 00:00 tempfile1

// 詳細情報を表示してコピー実行
[username@hostname ~]$ cp -v tempfile1 tempfile2‘tempfile1’ -> ‘tempfile2’

// ファイル状態(コピー後)
[username@hostname ~]$ ls -l tempfile*
-rw-r--r-- 1 username groupname 58 Sep 23 00:00 tempfile1
-rw-r--r-- 1 username groupname 58 Sep 23 00:00 tempfile2

コメント


Palette Codeなるべく丁寧にプログラミング関連技術を解説するサイト