更新されたファイルだけをコピーしたい

大量のファイルをバックアップやデプロイでコピーする際、変更のないファイルまで毎回コピーすると時間がかかる。差分バックアップを簡易的に実現したい場合、cpコマンドの-uオプションを使う。

-u で更新されたファイルのみをコピーする

-uオプションを使用すると、コピー元がコピー先より新しい場合、またはコピー先が存在しない場合のみコピーする。

まず、コピー先のファイルの一部を古い日付、一部を新しい日付にしておく。

$ ls -l src dst
dst:
-rw-r--r-- 1 root root 11 Jan  1  2020 file1.txt
-rw-r--r-- 1 root root 11 Jan  1  2030 file2.txt

src:
-rw-r--r-- 1 root root 21 Jul  5 06:37 file1.txt
-rw-r--r-- 1 root root 21 Jul  5 06:37 file2.txt

dst/file1.txtは2020年、dst/file2.txtは2030年の日付になっている。file1とfile2のタイムスタンプを設定した状態で-uオプションを付けてコピーする。

$ cp -uv src/*.txt dst/
'src/file1.txt' -> 'dst/file1.txt'

file1.txtのみコピーされ、file2.txtはコピーされていない。コピー結果は次のとおりである。

$ ls -l dst
-rw-r--r-- 1 root root 21 Jul  5 06:37 file1.txt
-rw-r--r-- 1 root root 11 Jan  1  2030 file2.txt

$ cat dst/file1.txt
content v2 (updated)

$ cat dst/file2.txt
content v1

dst/file1.txtはコピー元より古かったため上書きされ、内容が更新されている。dst/file2.txtはコピー元より新しかったため上書きされず、古い内容のままになっている。

コピー先が存在しない場合

コピー先にファイルが存在しない場合は、日付に関わらずコピーされる。srcにのみfile3.txtが存在し、dstには存在しない状態を用意する。

$ cp -uv src/file3.txt dst/
'src/file3.txt' -> 'dst/file3.txt'

用途

-uは以下のような場面で役立つ。

  • 大量のファイルの中から、変更されたファイルだけを差分バックアップしたい場合
  • デプロイ時に、変更のないファイルへのコピーやタイムスタンプ更新を避けたい場合

-vオプションと組み合わせると、実際にコピーされたファイルをログとして確認できる。