Linux / コマンド / install - ファイルのコピーと権限の設定

installは、ファイルをコピーする際に権限、所有者・グループ、タイムスタンプの処理および対象ディレクトリの作成を同時に行うコマンドです。パッケージインストーラーではなく、ビルド成果物を決められたシステムパスに配置するのに適したGNU Coreutilsツールです。

この記事では、実行ファイルと設定ファイルのインストール、-dによるディレクトリ作成、権限・所有権の指定、デバッグシンボル除去オプションおよびcpとの違いについて説明します。

installコマンドとは?

installは、元のファイルを対象にコピーした後、指定されたファイルモードと属性を適用します。基本作成モードは通常0755なので、設定ファイルのように実行権限が不要なファイルは-mとして明示する必要があります。ソフトウェアの依存関係を解決するaptやdnfとは目的が異なります。

基本的な文法

install [オプション] コピー元 コピー先
install [オプション] コピー元 ... ディレクトリ
install -d [オプション] ディレクトリ ...

ファイル名やパスに空白がある場合は引用符で囲み、ハイフンで始まる名前は可能であれば--の後に指定します。サポートされるオプションはディストリビューションとGNU Coreutilsのバージョンによって異なる場合があるため、install --helpとman installで現在のシステムの説明を確認してください。

installの基本的な使い方

実行ファイルのインストール

実行ファイルをシステムパスにコピーしながらモードを指定します。システムディレクトリに書き込み権限が必要な場合は、sudoをコマンドに明示します。

sudo install -m 0755 mytool /usr/local/bin/mytool

設定ファイルのインストール

設定ファイルは実行ファイル権限を必要としないため、適切なモードを指定します。既存の設定を上書きする前にバックアップを用意してください。以下の mytool.conf は実在するコピー元に置き換え、親の /etc/mytool は先に作成します。0644 は他のユーザーにも読み取りを許可するため、秘密を含まない設定ファイルの例です。秘密鍵や資格情報には必要な利用者だけが読めるモードを選びます。

sudo install -m 0644 mytool.conf /etc/mytool/mytool.conf

ターゲットディレクトリの作成

-d はファイルコピーではなく、ディレクトリ作成モードです。欠けている親ディレクトリを作成し、明示したディレクトリに権限や所有権を適用できます。例の myapp ユーザーとグループは先に作成されている必要があります。既存のディレクトリも属性設定の対象になるため、保存先を確認してください。

sudo install -d -m 0750 -o myapp -g myapp /var/lib/myapp

インストール後にモードを確認する

install はファイルをコピーし権限を同時に付与しますが、通常は成功メッセージは表示されません。

printf '#!/bin/sh\n' > demo-tool
install -m 755 demo-tool demo-tool-installed
stat -c '%a %n' demo-tool-installed

例の出力:

755 demo-tool-installed

この結果はターゲットファイルの権限モードのみをチェックします。スクリプトが正しく動作しているか、インストール場所がサービスパスと一致しているかを別途確認してください。

主なオプション

オプション 説明
-m MODE インストールしたいファイルやディレクトリの権限モードを指定してください。
-o OWNER 所有者ユーザーを指定します。一般的に、適切な権限が必要です。
-g GROUP 所有グループを指定します。
-d, --directory ディレクトリと必要な親パスを作成します。
-D 最後の引数のすべての上位ディレクトリを作成した後、ファイルをインストールします。
-t DIR 対象ディレクトリをオプションとして指定します。
-p, --preserve-timestamps 元のファイルのアクセス・修正時刻を適用します。
-s, --strip インストール過程でシンボルテーブルの削除を試みます。
-C, --compare 内容と一部の属性が同じ場合、不要なファイル変更を避けます。

長いオプションは意味を把握しやすく、スクリプトの確認にも役立ちます。ただし、移植性が重要なスクリプトでは対象システムがその GNU 拡張オプションをサポートしているかをまず確認してください。

実践的活用例

親パスとともにファイルをインストールする

-Dは、最終対象ファイルパスの親が存在しない場合に一緒に作成します。途中で作成される親ディレクトリには、通常 -m や現在の umask にかかわらず755相当の権限が使われます。umask は新規作成時に権限を制限する設定ですが、ここで親も同じモードになると考えないでください。親に独自の権限・所有権が必要なら、それぞれを install -d で明示的に準備します。

sudo install -D -m 0644 myapp.service /etc/systemd/system/myapp.service

複数のファイルを1つのディレクトリにインストールする

-t で対象ディレクトリを前もって指定すると、ファイルリストを動的に構成しやすくなります。例のコピー先を先に用意し、templates/*.html に一致する実在のファイルがあることを確認してください。

sudo install -m 0644 -t /usr/local/share/myapp templates/*.html

インストール結果を検証する

ファイルが正しいパスにあるか、権限や所有権が予想通りかを確認します。実行ファイルであれば、配布対象のシステムで必要なライブラリやアーキテクチャも確認する必要があります。

stat -c '%A %U:%G %n' /usr/local/bin/mytool
file /usr/local/bin/mytool

installに関連するコマンドの比較

コマンド・方法 主な役割 適した状況
install コピーと権限・所有権の設定 ビルド成果物と設定ファイルの配置
cp 一般的なファイルコピー 属性設定を別のステップで管理する場合
mkdir 一般ディレクトリの作成 作業用ディレクトリ構造を作成する場合
apt·dnf パッケージ依存関係とデータベース管理 配布パッケージをインストール・更新する場合

使用する際の注意点

install は拡張属性を保持しません。元の属性を幅広く保持したいバックアップではcpのアーカイブコピーとの違いを確認してください。-s のシンボルテーブルは、実行ファイルに含まれる関数名などの情報を管理する表です。シェルスクリプトや設定ファイルに指定するオプションではありません。

パッケージマネージャーの代わりにはならない

installはファイル配置ツールであり、依存関係、削除履歴、更新および整合性の検証を管理しません。配布パッケージで提供されるソフトウェアの場合は、まずパッケージマネージャーを確認してください。

デフォルトモードをそのまま信頼しない

設定ファイルと秘密鍵に対して実行・読み取り権限が過剰に付与されないように、-mを明示してください。

既存ファイルの上書きポリシーを決める

運用環境の設定ファイルを直接置き換えると、サービス障害やユーザーの変更の喪失が発生する可能性があります。バックアップ、比較、原子的な切り替えとロールバック手順を準備してください。

FAQ

install コマンドはプログラムパッケージをインストールしますか?

いいえ。ファイルを指定したパスにコピーして属性を設定するツールです。パッケージの依存関係は管理しません。

cp の代わりに install を使う理由は何ですか?

コピーとともにファイルモード、所有者・グループ、対象ディレクトリの作成を1つのコマンドで指定できるため、ビルド・配布スクリプトが明確になります。

ディレクトリだけ作れますか?

install -d ディレクトリ を使用します。-m、-o、-g も一緒に指定できます。

元のタイムスタンプを保持するにはどうすればよいですか?

-p または --preserve-timestamps を使用します。

参考資料