更新されたファイルだけをコピーしたい
大量のファイルをバックアップやデプロイでコピーする際、変更のないファイルまで毎回コピーすると時間がかかる。差分バックアップを簡易的に実現したい場合、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オプションと組み合わせると、実際にコピーされたファイルをログとして確認できる。
\第一線のプログラマーの行動原理を学べる!/
