cp は Unix の基本的なコマンドの 1 つです。ソースから宛先に 1 つ以上のファイルまたはディレクトリをコピーするために使用されることは既にご存じでしょう。
このチュートリアルは初心者向けですが、実用的な例を使用してさまざまな cp コマンド オプションをすばやく確認することは、誰にとっても役に立ちます。
常に cp コマンドを使用している場合でも、以下で説明する 1 つまたは複数の例は初めてかもしれません。
コピー コマンドの一般的な形式:
cp [option] source destination
1.ソースから宛先にファイルまたはディレクトリをコピーします
ファイルをコピーするには、コピー元とコピー先をコピー コマンドに渡す必要があります。次の例では、ファイルを project/readme.txt から projectbackup/readme-new.txt にコピーします
$ cp project/readme.txt projectbackup/readme-new.txt $ cd projectbackup/ $ ls readme-new.txt
あるフォルダから同じ名前の別のフォルダにファイルをコピーする場合は、以下に示すようにコピー先のディレクトリ名だけで十分です。
$ cp project/readme.txt projectbackup/ $ cd projectbackup/ $ ls readme.txt
以下に示すように、再帰オプション -r を使用して、ディレクトリ (およびそのすべてのコンテンツ) をコピー元からコピー先にコピーできます。
$ ls project src/ bin/ doc/ lib/ test/ readme.txt LICENSE $ cp -r project/ backup/ $ ls backup src/ bin/ doc/ lib/ test/ readme.txt LICENSE
2.複数のファイルまたはディレクトリをコピー
以下に示すように、ソースから宛先に複数のファイルをコピーできます:
$ cd src/ $ cp global.c main.c parse.c /home/thegeekstuff/projectbackup/src/
ソース ファイルに共通のパターンがある場合は、次に示すようにワイルドカードを使用します。この例では、すべての c 拡張ファイルが /home/thegeekstuff/projectbackup/src/ ディレクトリにコピーされます。
$ cp *.c /home/thegeekstuff/projectbackup/src/
以下に示すように、複数のディレクトリをコピーします。
$ cd project/ $ cp -r src/ bin/ /home/thegeekstuff/projectbackup/
3.宛先にコピーする前にバックアップ
宛先ファイルが同じ名前で既に存在する場合、cp を使用すると、宛先ファイルを上書きする前にバックアップできます。
この例では、readme.txt が project/ と projectbackup/ ディレクトリの両方に存在し、project/ から projectbackup/ にコピーするときに、次のように既存の readme.txt がバックアップされます。
$ cd projectbackup $ ls -l readme.txt -rw-r--r-- 1 bala geek 1038 Jan 8 13:15 readme.txt $ cd ../project $ ls -l readme.txt -rw-r--r-- 1 bala geek 1020 Jan 8 12:25 readme.txt $ cp --backup readme.txt /home/thegeekstuff/projectbackup/
以下に示すように、既存のファイルは readme.txt~ に移動され、新しいファイルは readme.txt としてコピーされます。
$ cd /home/thegeekstuff/projectbackup/ $ ls -l -rw-r--r-- 1 bala geek 1020 Jan 8 13:36 readme.txt -rw-r--r-- 1 bala geek 1038 Jan 8 13:15 readme.txt~
バックアップについて言えば、ファイルを効果的にバックアップするために rsync コマンドがどのように機能するかを理解することが重要です。
4.コピー中にリンクを保持
cp コマンドを実行すると、ソースがリンク ファイルの場合、リンク ファイルではなく実際のファイルがコピーされます。リンクをそのままコピーしたい場合は、以下のようにオプション -d を指定してください:
以下は、オプション -d を指定しないと、(リンクではなく) ファイルをコピーすることを示しています:
$ cd project/bin $ ls -l startup.sh lrwxrwxrwx 1 root root 18 Jan 8 13:59 startup.sh -> ../test/startup.sh $ cp startup.sh /home/thegeekstuff/projectbackup/bin/ $ cd /home/thegeekstuff/projectbackup/bin/ $ ls -l -rw-r--r-- 1 root root 102 Jan 8 14:02 startup.sh
コピー中にリンクを保持するには、次の手順を実行します:
$ cd project/bin $ cp -d startup.sh /home/thegeekstuff/projectbackup/bin/ $ ls -l startup.sh lrwxrwxrwx 1 root root 18 Jan 8 14:10 startup.sh -> ../test/startup.sh
5.既存のファイルを上書きしない
コピー先ファイルが存在しない場合にのみコピーしたい場合は、以下のようにオプション -n を使用します。これは既存のファイルを上書きせず、cp コマンドは以下に示す成功終了コードを返します:
$ cd projectbackup $ ls -l readme.txt -rw-r--r-- 1 bala geek 1038 Jan 8 13:15 readme.txt $ cd ../project $ ls -l readme.txt -rw-r--r-- 1 bala geek 1020 Jan 8 12:25 readme.txt $ cp -n readme.txt /home/thegeekstuff/projectbackup/bin/ $ echo $? 0
以下に示すように、宛先ファイルは上書きされませんでした。
$ cd projectbackup $ ls -l readme.txt -rw-r--r-- 1 bala geek 1038 Jan 8 13:15 readme.txt
6.上書き前に確認(インタラクティブモード)
-i オプションを使用すると、以下に示すように、ファイルを上書きする前に確認を求められます。
$ cp -i readme.txt /home/thegeekstuff/projectbackup/ cp: overwrite `/home/thegeekstuff/projectbackup/readme.txt'? y
7.ファイルへのハード リンクを作成する (コピーする代わりに)
cp コマンドを実行すると、(ファイルをコピーする代わりに) ファイルのハード リンクを作成することができます。次の例では、sample.txt ファイルのハード リンクをディレクトリ test/ に作成します。
$ ls -li sample.txt 10883362 -rw-r--r-- 2 bala geek 1038 Jan 9 18:40 sample.txt $ cp -l sample.txt test/ $ ls -li test/sample.txt 10883362 -rw-r--r-- 2 bala geek 1038 Jan 9 18:40 test/sample.txt
上記のように、test/sample.txt は sample.txt ファイルにハード リンクされたファイルであり、両方のファイルの inode は同じです。
8.ファイルまたはディレクトリへのソフト リンクを作成する (コピーする代わりに)
cp コマンドを実行すると、ファイルまたはディレクトリへのソフトリンクを作成できます。次の例では、libFS.so.6.0.0 のシンボリック リンクが libFS.so として作成されます。
# cd /usr/lib/ # ls -l libFS.so.6.0.0 -rw-r--r-- 1 root root 42808 Nov 19 2010 libFS.so.6.0.0 # cp -s libFS.so.6.0.0 libFS.so # ls -l libFS.so lrwxrwxrwx 1 root root 14 Jan 9 20:18 libFS.so -> libFS.so.6.0.0
9.コピー中にファイルまたはディレクトリの属性を保持
-p オプションを使用すると、以下に示すように、ファイルまたはディレクトリのプロパティを保持できます:
$ ls -l sample.txt -rw-r--r-- 2 bala geek 1038 Jan 9 18:40 sample.txt $ cp -p sample.txt test/ $ ls -l test/sample.txt -rw-r--r-- 2 bala geek 1038 Jan 9 18:40 test/sample.txt
モード、所有権、タイムスタンプなどの必要なプロパティのみを保持することもできます。
次の例では、コピー中にファイルのモードを保持します:
$ cp --preserve=mode sample.txt test/
10.ソース ファイルが宛先よりも新しいか見つからない場合にのみコピー
小さいファイルはコピーにそれほど時間はかかりませんが、巨大なファイルをコピーするとかなりの時間がかかる場合があります。そのため、大きなファイルをコピーするときは、ソース ファイルが宛先ファイルよりも新しい場合、または以下に示すように -u オプションを使用して宛先ファイルが見つからない場合にのみ行うようにしてください。
この例では、2 つのファイル LICENSE と readme.txt が project/ から projectbackup/ にコピーされます。ただし、LICENSE ファイルは projectbackup/ ディレクトリに既に存在し、project/ ディレクトリ内のファイルよりも新しいものです。
$ cd project/ $ ls -l LICENSE readme.txt -rw-r--r-- 1 bala geek 108 Jan 8 13:14 LICENSE -rw-r--r-- 1 bala geek 32 Jan 8 13:16 readme.txt $ cd /home/thegeekstuff/projectbackup/ $ ls -l LICENSE readme.txt ls: cannot access readme.txt: No such file or directory -rw-r--r-- 1 root root 112 Jan 9 20:31 LICENSE
したがって、この例では、LICENSE ファイルを projectbackup/ ディレクトリに再度コピーする必要はありません。以下に示すように -u オプションを使用すると、これは cp コマンドによって自動的に処理されます。以下の例では、ファイルのタイムスタンプで示されているように、readme.txt ファイルのみがコピーされました。
$ cp -u -v LICENSE readme.txt /home/thegeekstuff/projectbackup/ `readme.txt' -> `/home/thegeekstuff/projectbackup/readme.txt' $ cd /home/thegeekstuff/projectbackup/ $ ls -l LICENSE readme.txt -rw-r--r-- 1 bala geek 112 Jan 9 20:31 LICENSE -rw-r--r-- 1 bala geek 32 Jan 9 22:17 readme.txt