installコマンドは、cpコマンドによく似たコマンドですがファイルをコピーすると同時にパーミッションを設定できる点がcpコマンドと異なります。
Makefileで実行プログラムをインストールディレクトリにコピーするとき利用することができます。
目次
- 1 installコマンドの利用例
- 1.1 ファイルのコピー (オプションなし)
- 1.2 ディレクトリを作成 (-dオプション)
- 1.3 複数のファイルを特定のディレクトリにコピー (-tオプション)
- 1.4 ディレクトリが存在しない場合に複数のファイルをコピー (-Dオプション)
- 1.5 コピーするファイル名を表示 (-vオプション)
- 1.6 デバック情報を削除してプログラムをコピー (-sオプション)
- 1.7 権限を変更してファイルをコピー (-mオプション)
- 1.8 所有者の変更 (-oオプション)
- 1.9 グループの変更 (-gオプション)
- 1.10 バックアップ (-bオプション)
- 1.11 タイムスタンプをコピー前のファイルと同じに (-pオプション)
- 1.12 比較して修正するかどうか決定 (-Cオプション)
- 2 参考
installコマンドの利用例
ファイルのコピー
(オプションなし)
installコマンドは、cpコマンドとよく似たコマンドで、ファイルをコピーするコマンドになります。ただし、ファイルのパーミッションなどを設定することができます。
例えば、installコマンドは以下のような構文で使用することができます。
1 |
install sourcefile destfile |
sourcefileはコピー元のファイル、destfileはコピー先のファイルになります。
オプションなしでファイルをコピーするとパーミッションは755(rwxr-xr-x)に設定されてファイルがコピーされます。
また、コマンド例のhelloというファイルは「Hello World!!」を表示する実行プログラムになります。
コマンド例
1 |
install hello install_hello |
実行結果(確認)
1 2 3 |
$ls -l hello install_hello -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:37 hello -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 16:41 install_hello |
ディレクトリを作成
(-dオプション)
installコマンドはディレクトリを作成することもできます。また、親ディレクトリが存在しない場合はその存在しない親ディレクトリも同時に作成されます。
構文は以下のようになります。
1 |
install -d directory... |
ディレクトリのパーミッションはデフォルトでは755(rwxr-xr-x)に設定されます。
コマンド例
1 |
install -d dir/app/bin dir/app/lib |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ls -lR .: 合計 4 drwxr-xr-x 3 ubuntu ubuntu 4096 10月 9 17:05 dir ./dir: 合計 4 drwxr-xr-x 4 ubuntu ubuntu 4096 10月 9 17:05 app ./dir/app: 合計 8 drwxr-xr-x 2 ubuntu ubuntu 4096 10月 9 17:05 bin drwxr-xr-x 2 ubuntu ubuntu 4096 10月 9 17:05 lib ./dir/app/bin: 合計 0 ./dir/app/lib: 合計 0 |
複数のファイルを特定のディレクトリにコピー
(-tオプション)
installコマンドは、特定のディレクトリが存在するときに複数のファイルを同時にコピーすることができます。その場合の構文は以下のようになります。sourcefileは1つ以上のコピーするファイルで、destdirはコピー先のディレクトリになります。
1 |
install -t destdir sourcefile... |
以下の構文でもコピーができます。
1 |
install sourcefile... destdir |
コマンド例は以下のようになります。ただし、コマンド例のhello2,hello3,...,hello5はhelloという実行プログラムのコピーになります。
コマンド例
1 |
install -t install_dir hello* |
コマンド例実行前
1 2 3 4 5 6 7 8 9 10 11 12 |
$ls -lR .: 合計 64 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:37 hello -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello2 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello3 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello4 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello5 drwxrwxr-x 2 ubuntu ubuntu 4096 10月 9 16:52 install_dir ./install_dir: 合計 0 |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ls -lR .: 合計 64 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:37 hello -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello2 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello3 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello4 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello5 drwxrwxr-x 2 ubuntu ubuntu 4096 10月 9 16:53 install_dir ./install_dir: 合計 60 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 16:53 hello -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 16:53 hello2 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 16:53 hello3 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 16:53 hello4 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 16:53 hello5 |
ディレクトリが存在しない場合に複数のファイルをコピー
(-Dオプション)
ディレクトリが存在しない場合に、ディレクトリを作成してファイルをコピーする場合は、-Dオプションを用います。
コマンド例
1 |
install -D -t install_dir hello* |
コマンド例実行前
1 2 3 4 5 6 7 8 |
$ls -lR .: 合計 60 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:37 hello -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello2 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello3 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello4 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello5 |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ls -lR .: 合計 64 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:37 hello -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello2 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello3 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello4 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 16:46 hello5 drwxr-xr-x 2 ubuntu ubuntu 4096 10月 9 17:16 install_dir ./install_dir: 合計 60 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 17:16 hello -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 17:16 hello2 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 17:16 hello3 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 17:16 hello4 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 17:16 hello5 |
以下の構文では、ディレクトリを作成するために-Dオプションを使用することはできません。
1 |
install -D sourcefile... destdir |
-Dオプションは、-tオプション(--target-directory)でディレクトリを指定した時に、ディレクトリが存在しない場合にディレクトリが作成されます。
コマンド例
1 |
install -D hello app/bin/install_hello |
コマンド例実行前
1 2 3 4 |
$ls -lR .: 合計 12 -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 20:38 hello |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ls -lR .: 合計 16 drwxr-xr-x 3 ubuntu ubuntu 4096 10月 9 20:40 app -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 20:38 hello ./app: 合計 4 drwxr-xr-x 2 ubuntu ubuntu 4096 10月 9 20:40 bin ./app/bin: 合計 12 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:40 install_hello |
コピーするファイル名を表示
(-vオプション)
installコマンドの冗長モード(詳細な情報を表示するモード)で、installコマンドがコピーするファイル名や作成するディレクトリ名を表示します。
コマンド例と実行結果
1 2 3 4 5 6 7 |
$install -v -D -t install_dir hello* install: ディレクトリ 'install_dir' を作成しています 'hello' -> 'install_dir/hello' 'hello2' -> 'install_dir/hello2' 'hello3' -> 'install_dir/hello3' 'hello4' -> 'install_dir/hello4' 'hello5' -> 'install_dir/hello5' |
デバック情報を削除してプログラムをコピー
(-sオプション)
-sオプションは、プログラムをコピーする際に実行ファイルのシンボルテーブルを削除して、ファイルをコピーすることができます。
例えば、hello.cというファイルからhelloという実行ファイルを作成し、installコマンドでstrip-helloという名前でプログラムをコピーしてみます。
hello.c
1 2 3 4 5 6 |
#include <stdio.h> int main(void){ printf("Hello World!!\n"); return 0; } |
hello.cのコンパイル
1 |
gcc -o hello hello.c |
installコマンドのコマンド例
1 |
install -s hello strip_hello |
実行結果
1 2 3 |
$ls -l hello strip_hello -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 14:19 hello -rwxr-xr-x 1 ubuntu ubuntu 6312 10月 9 15:12 strip_hello |
また、gccオプションでプログラム作成時に-sオプションを用いるとシンボルテーブルを削除して実行ファイルを生成することができます。
1 2 3 4 5 |
$gcc -s -o gcc_strip_hello hello.c $ls -l hello strip_hello gcc_strip_hello -rwxrwxr-x 1 ubuntu ubuntu 6312 10月 9 15:16 gcc_strip_hello -rwxrwxr-x 1 ubuntu ubuntu 8600 10月 9 14:19 hello -rwxr-xr-x 1 ubuntu ubuntu 6312 10月 9 15:12 strip_hello |
権限を変更してファイルをコピー
(-mオプション)
-mオプションを用いるとファイルの権限(パーミッション)を変更して、ファイルをコピーすることができます。installコマンドのデフォルトでは、755(rwxr-xr-x)の権限がデフォルトで、正確には「u=rwx,go=rx,a-s」で「a-s」はset-user-IDやset-group-IDを取り除くことを意味します。
コマンド例
1 2 |
install -m 700 -D hello dir/install_hello install -m 700 -d dir2 |
コマンド例実行前
1 2 3 4 |
$ls -lR .: 合計 12 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:28 hello |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ls -lR .: 合計 20 drwxr-xr-x 2 ubuntu ubuntu 4096 10月 10 14:49 dir drwx------ 2 ubuntu ubuntu 4096 10月 10 14:56 dir2 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:28 hello ./dir: 合計 12 -rwx------ 1 ubuntu ubuntu 8600 10月 10 14:49 install_hello ./dir2: 合計 0 |
所有者の変更
(-oオプション)
もし適切な権限を持っているなら、-oオプションでファイルをコピーするときに所有者の変更を行うことができます。もし適切な権限を持っている場合は、所有者のデフォルトはrootになります。
コマンド例ではownerという名前のユーザの所有権としてファイルをコピーします。
また、グループは特に設定していないため、デフォルトになります。
コマンド例
1 |
sudo install -o owner hello owner_hello |
コマンド例実行前
1 2 3 4 |
$ls -lR .: 合計 12 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:28 hello |
実行結果
1 2 3 4 5 |
$ls -lR .: 合計 24 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:28 hello -rwxr-xr-x 1 owner root 8600 10月 10 15:14 owner_hello |
グループの変更
(-gオプション)
-gオプションでグループの変更を行うことができます。デフォルトはプロセスを処理するときのグループになります。
コマンド例では、groupという名前のグループに変更します。ただし、現在のユーザであるubuntuがgroupという名前のグループに属していないため、root権限として実行しています。
また、所有者は特に設定していないため、デフォルトになります。
コマンド例
1 |
sudo install -g group hello group_hello |
コマンド例実行前
1 2 3 4 |
$ls -lR .: 合計 12 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:28 hello |
実行結果
1 2 3 4 5 |
$ls -lR .: 合計 24 -rwxr-xr-x 1 root group 8600 10月 10 15:30 group_hello -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:28 hello |
バックアップ
(-bオプション)
-bオプションで、ファイルが上書きされるときに、その上書きされる前のファイルをバックアップとして保存することができます。
バックアップされるファイルはファイル名の末尾に~(チルダ)がつけられたファイルとして保存されます。
コマンド例
1 |
install -b hello install_hello |
コマンド例実行前
1 2 3 4 5 |
$ls -lR .: 合計 24 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:28 hello -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 10 15:40 install_hello |
実行結果
1 2 3 4 5 6 |
$ls -lR .: 合計 36 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:28 hello -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 10 15:41 install_hello -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 10 15:40 install_hello~ |
また、バックアップを作成するときに-Sオプションで接尾辞を指定することもできます。
コマンド例
1 |
install -S .bak -b hello install_hello |
実行結果
1 2 3 4 5 6 7 |
$ls -lR .: 合計 48 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:28 hello -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 10 15:43 install_hello -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 10 15:41 install_hello.bak -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 10 15:40 install_hello~ |
タイムスタンプをコピー前のファイルと同じに
(-pオプション)
-pオプションで、コピー前のファイルと同じタイムスタンプのファイルをコピーすることができます。
これは、最後にインストールされた時間ではなく、最後にプログラムをビルドした時間を記録したいときに役立ちます。
コマンド例
1 |
install -p hello install_hello |
コマンド例実行前
1 2 3 4 |
$ls -lR .: 合計 12 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:28 hello |
実行結果
1 2 3 4 5 |
$ls -lR .: 合計 24 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:28 hello -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:28 install_hello |
比較して修正するかどうか決定
(-Cオプション)
-Cオプションは、コピー先とコピー元のファイルを比較して、同じ内容で指定した所有者、グループ、権限ならばコピー先のファイルを修正しません。
コマンド例では、まずディレクトリを確認してコピー先のファイルと同じファイルの存在を確認しています。その後に、通常のinstallコマンドを-vオプションで情報を表示する状態でどのように実行されているかを確認しています。
その後に-Cオプションを追加したinstallコマンドを使用して、何も動作していないことを確認しています。
最後に-Cオプションをつけた状態でコピー先とは違う権限を指定し、指定された権限がコピー先と違うためファイルがコピーされるのを確認した後にもう一度ディレクトリを確認しています。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ls -lR .: 合計 24 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:28 hello -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 10 16:12 install_hello $install -v hello install_hello 'install_hello' を削除しました 'hello' -> 'install_hello' $install -v -C hello install_hello $ $install -v -m 700 -C hello install_hello 'install_hello' を削除しました 'hello' -> 'install_hello' $ $ls -lR .: 合計 24 -rwxr-xr-x 1 ubuntu ubuntu 8600 10月 9 20:28 hello -rwx------ 1 ubuntu ubuntu 8600 10月 10 16:13 install_hello $ |