【cp】Linuxコマンド_ファイル・ディレクトリをコピーする

Linuxでファイルやディレクトリをコピーしたい場合は「cp」コマンドを実施します。




「cp」コマンドの使い方(Linux)

cpコマンドはファイルやディレクトリをコピーする際に使用します。

以下では「testfile01.txt」というファイルのコピーを作成する例となります。

対象のファイルとディレクトリが表示されている事を確認します。

$ ls -l
total 12
-rwx------ 1 root root  701 Dec  4  2020 ks-script-9ku3azco
-rwx------ 1 root root  671 Dec  4  2020 ks-script-xitofm08
drwxr-xr-x 2 root root 4096 Jul 10 03:02 test
-rw-r--r-- 1 root root    0 Jul 10 03:04 testfile01.txt

「testfile01.txt」の中身のデータを表示します。

$ cat testfile01.txt 
test01
test01
test01

「testfile01.txt」を「testfile02.txt」へコピーします。

$ cp testfile01.txt testfile02.txt 

ちなみに以下のように同じ名前の新規ファイルを作成し、コピーするとエラーとなってしまいます。

$ cp testfile01.txt testfile01.txt 
cp: 'testfile01.txt' and 'testfile01.txt' are the same file

新規に「testfile02.txt」というファイルが作成されたことが確認できます。

$ ls -l
total 20
-rwx------ 1 root root  701 Dec  4  2020 ks-script-9ku3azco
-rwx------ 1 root root  671 Dec  4  2020 ks-script-xitofm08
drwxr-xr-x 2 root root 4096 Jul 10 03:05 test
-rw-r--r-- 1 root root   21 Jul 10 03:13 testfile01.txt
-rw-r--r-- 1 root root   21 Jul 10 03:14 testfile02.txt

ファイルの中身を確認すると「testfile01.txt」のデータが表示され、コピーされたことが確認できます。

$ cat testfile02.txt 
test01
test01
test01

ファイルをディレクトリ内にコピーする

コピーの使用例として、以下では、「tmp」ディレクトリ配下でファイルとディレクトリを作成します。

  • ファイル:testfile01.txt
  • ディレクトリ:test

このファイル「testfile01.txt」をディレクトリ「test」へコピーします。

対象のファイルとディレクトリが表示されている事を確認します。

$ ls -l
total 20
-rwx------ 1 root root  701 Dec  4  2020 ks-script-9ku3azco
-rwx------ 1 root root  671 Dec  4  2020 ks-script-xitofm08
drwxr-xr-x 2 root root 4096 Jul 10 03:27 test
-rw-r--r-- 1 root root   21 Jul 10 03:13 testfile01.txt
-rw-r--r-- 1 root root   21 Jul 10 03:14 testfile02.txt

ファイルをディレクトリへコピーします。

$ cp testfile01.txt test/

カレントディレクトリではコピーが作成されていないことを確認します。

$ ls -l
total 20
-rwx------ 1 root root  701 Dec  4  2020 ks-script-9ku3azco
-rwx------ 1 root root  671 Dec  4  2020 ks-script-xitofm08
drwxr-xr-x 2 root root 4096 Jul 10 03:28 test
-rw-r--r-- 1 root root   21 Jul 10 03:13 testfile01.txt
-rw-r--r-- 1 root root   21 Jul 10 03:14 testfile02.txt

「test」ディレクトリ配下で「testfile01.txt」のファイルがコピーされていることが確認できます。

$ ls -l test/               
total 4
-rw-r--r-- 1 root root 21 Jul 10 03:28 testfile01.txt



複数のファイルをコピーする

次に複数のファイルを「test」ディレクトリへコピーします。

$ cp testfile01 testfile02.txt test/

まとめて「test」ディレクトリにファイルがコピーされたことが確認できます。

$ ls -l test/
total 8
-rw-r--r-- 1 root root 21 Jul 10 03:39 testfile01.txt
-rw-r--r-- 1 root root 21 Jul 10 03:39 testfile02.txt

同じファイルがある場合は上書きをするかメッセージ表示される

コピー先に同じファイルがある場合は以下のように、ファイルを上書きするか確認が求められます。

  • 上書きOKであれば「y」
  • 上書きNGであれば「n」

を入力します。

$ cp testfile01.txt testfile02.txt test/
cp: overwrite 'test/testfile01.txt'? y
cp: overwrite 'test/testfile02.txt'? y

間違って上書きされないように注意しましょう。

ディレクトリ全体をコピー

ディレクトリ全体をコピーするには「-r」オプションを使用します。
以下では「test」ディレクトリを「test01_dir」という新しいディレクトリとしてコピーします。

$ cp -r test/ test01_dir/

新規に「test01_dir」が作成されたことを確認します。

$ ls -l
total 28
-rwx------ 1 root root  701 Dec  4  2020 ks-script-9ku3azco
-rwx------ 1 root root  671 Dec  4  2020 ks-script-xitofm08
drwxr-xr-x 2 root root 4096 Jul 10 03:38 test
drwxr-xr-x 2 root root 4096 Jul 10 03:54 test01_dir
drwxr-xr-x 3 root root 4096 Jul 10 03:44 test02_dir
-rw-r--r-- 1 root root   21 Jul 10 03:13 testfile01.txt
-rw-r--r-- 1 root root   21 Jul 10 03:14 testfile02.txt

「test01_dir」配下に「test」ディレクトリのファイルがコピーされていることが確認できます。

$ ls -l test01_dir/
total 8
-rw-r--r-- 1 root root 21 Jul 10 03:54 testfile01.txt
-rw-r--r-- 1 root root 21 Jul 10 03:54 testfile02.txt

ディレクトリを別ディレクトリ内へコピー

「test」ディレクトリ全体を「test02_dir」配下にコピーする際は以下のコマンドとなります。

$ cp -r test/ test02_dir/

コピー後、「test02_dir」配下に「test」ディレクトリがコピーされたことが確認できます。

$ ls -l test02_dir/
total 4
drwxr-xr-x 2 root root 4096 Jul 10 03:44 test

コピーされた「test」配下のファイルも同じくコピーされていることが確認できます。

$ ls -l test02_dir/test/
total 8
-rw-r--r-- 1 root root 21 Jul 10 03:44 testfile01.txt
-rw-r--r-- 1 root root 21 Jul 10 03:44 testfile02.txt

「cp」コマンドオプション

「cp」コマンドのオプションは以下の通りとなります。

$ cp --help
使用法: cp [OPTION]... [-T] SOURCE DEST
または: cp [OPTION]... SOURCE... DIRECTORY
または: cp [OPTION]... -t DIRECTORY SOURCE...
Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

Mandatory arguments to long options are mandatory for short options too.
  -a, --archive                -dR --preserve=all と同様
      --attributes-only        ファイルのデータをコピーせず、ファイルの属性のみコピーする
      --backup[=CONTROL]       コピー先ファイルが存在する時にバックアップを作成する
  -b                           --backup と同様だが引数を受け付けない
      --copy-contents          再帰時に特殊ファイルの内容をコピーする
  -d                           --no-dereference --preserve=links と同様
  -f, --force                  if an existing destination file cannot be
                                 opened, remove it and try again (this option
                                 is ignored when the -n option is also used)
  -i, --interactive            prompt before overwrite (overrides a previous -n
                                  option)
  -H                           follow command-line symbolic links in SOURCE
  -l, --link                   コピーの代わりにファイルのハードリンクを作成する
  -L, --dereference            SOURCE にあるシンボリックリンクを常にたどる
  -n, --no-clobber             存在するファイルを上書きしない (前に指定した
                                 -i オプションを上書きする)
  -P, --no-dereference         SOURCE にあるシンボリックリンクを決してたどらない
  -p                           --preserve=mode,ownership,timestamps と同様
      --preserve[=ATTR_LIST]   指定した属性を保護する (デフォルト: mode,ownership,
                                 timestamps)。追加可能な属性: context, links, 
                                 xattr, all
  -c                           deprecated, same as --preserve=context
      --no-preserve=ATTR_LIST  指定した属性を保護しない
      --parents                DIRECTORY 配下で SOURCE ファイルのフルパス名を使用する
  -R, -r, --recursive          再帰的にディレクトリをコピーする
      --reflink[=WHEN]         clone/CoW コピーを制御する。下記を参照
      --remove-destination     コピー先にファイルが存在する場合、開く前に削除する
                                 (--force と対照的)
      --sparse=WHEN            スパースファイル作成を制御する。下記を参照
      --strip-trailing-slashes  各 SOURCE 引数から末尾のスラッシュを全て削除
                                 する
  -s, --symbolic-link          コピーの代わりにシンボリックリンクを作成する
  -S, --suffix=SUFFIX          通常のバックアップ接尾辞を上書きする
  -t, --target-directory=DIRECTORY  全ての SOURCE 引数を DIRECTORY にコピーする
  -T, --no-target-directory    DEST を通常ファイルとして扱う
  -u, --update                 SOURCE ファイルがコピー先ファイルより新しいか
                                 存在しない時だけコピーする
  -v, --verbose                実行していることを説明する
  -x, --one-file-system        このファイルシステムだけで実行する
  -Z                           set SELinux security context of destination
                                 file to default type
      --context[=CTX]          like -Z, or if CTX is specified then set the
                                 SELinux or SMACK security context to CTX
      --help     この使い方を表示して終了する
      --version  バージョン情報を表示して終了する

By default, sparse SOURCE files are detected by a crude heuristic and the
corresponding DEST file is made sparse as well.  That is the behavior
selected by --sparse=auto.  Specify --sparse=always to create a sparse DEST
file whenever the SOURCE file contains a long enough sequence of zero bytes.
Use --sparse=never to inhibit creation of sparse files.

When --reflink[=always] is specified, perform a lightweight copy, where the
data blocks are copied only when modified.  If this is not possible the copy
fails, or if --reflink=auto is specified, fall back to a standard copy.
Use --reflink=never to ensure a standard copy is performed.

The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.
The version control method may be selected via the --backup option or through
the VERSION_CONTROL environment variable.  Here are the values:

  none, off       バックアップを作成しない (--backup を付けた時でも)
  numbered, t     番号付きバックアップを作成する
  existing, nil   番号付きバックアップがあれば番号付き、
                      そうでなければ、simple で作成する
  simple, never   常に簡易バックアップを作成

特別な場合として、cp は -f と -b オプションが与えられ、SOURCE と DEST が
同一ファイルである時は、SOURCE のバックアップを作成します。

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report cp translation bugs to <https://translationproject.org/team/>
Full documentation at: <https://www.gnu.org/software/coreutils/cp>
or available locally via: info '(coreutils) cp invocation'

「cp」コマンドの使い方は以上となります。

最新情報をチェックしよう!