mkdirやtouchとchmod, chown, chgrpあたりを1つのコマンドでまとめてやる


構築手順書をせっせと作ったり()、dockerfile書いたり、こういう記事書いたりするときに、
mkdirしたりcptouchしたものに対して、chmod, chown, chgrpを実行する、というのはよくやりがちだと思うのですが、
それをそれぞれ個別にやってるケースを見かけるので、一気にやる方法をまとめてみます。
(dockerfileで&&で複数コマンド繋ぐよりはスマートかな?)

(基本的にGNU系(centosで確認しました)でもBSD系(Mac OSXで確認しました)でもどちらでもいけると思ってますが、何かあればコメントいただければと思います。)

chownchgrp

グループの変更はchownでもできます。
(なので実質chgrpって使うこと滅多にない気が……)

chown user:group path/to/file

これで、所有者がuserに、グループがgroupに変更されます。
:(コロン)は.(ドット)でもいける環境もあるようですが、これは古い形式で非推奨のようです。
- GNU Coreutils: chown invocation
- chown - FreeBSD

以下のように、groupを省略して:だけ置けば、所有者と合わせて、グループも所有者の(プライマリ)グループに変更されます。
※これはGNU系版だけで、BSD系版では単にuserが変更されるだけのようです

chown user: path/to/file

ちなみにuserを省略して、:を前に置けば、グループだけの変更も可能です
(chgrpの立場は… )

chown :group path/to/file

mkdirchmod, chown, chgrp

mkdir-mオプションでmodeを指定できます。
-pオプションは今回の話とは関係ないですが、付けといた方いいので付けときます(以下同様)

mkdir -p -m 777 path/to/dir
# 権限を持ってない場合
sudo mkdir -p -m 777 path/to/dir

chown, chgrpもまとめてやりたい場合は2通りの方法があります。

指定するユーザーが、作成する場所の書き込み権限を持っている場合
(かつ、指定するグループが指定するユーザーのプライマリグループの場合)

この場合は、sudoで別のユーザーとして実行しちゃえばいいですよね。

sudo -u user mkdir -p -m 777 path/to/dir

ただし、この方法だと、userが書き込み権限を持っていない場合は失敗してしまいます。

なのでこの場合はもう1つの方法として、権限を持っているユーザー(主にroot)で、installコマンドを使い、オプションでモード、所有者、グループをそれぞれ指定します。

sudo install -m 777 -o user -g group -d path/to/dir

(mkdir-pオプションと同等のことをしてくれます。)
mkdirと同じように、複数ディレクトリをまとめて作成することもできます。
(ただし、-pオプション分の部分のディレクトリは、オプションが反映されず、所有者はrootで権限は755になります><)

参考: installコマンドでコマンド数を減らす - @znz blog

ファイルとchmod, chown, chgrp

先ほど挙げた記事にも書かれていますが、installコマンドは、ファイルのコピーにも使えます。
(というかこっちが本業)
この場合は、途中までのディレクトリは作成してくれません。

cpchmod, chown, chgrpをまとめて

sudo install -m 0644 -o user -g group other/path/to/source path/to/dist

touchchmod, chown, chgrpをまとめて

sudo install -m 0644 -o user -g group /dev/null path/to/file

補足:installコマンドについて

なんでinstallなんて名前のコマンドでこんなことができるんだ?って感じですが、
これは元々make内で使用するためのコマンドのようです。
なので、パーミッションや所有者を指定してディレクトリを作ったりファイルをコピーしたりする機能があるんですね。

他にもバックアップを取るオプションなどもありますので気になる方は以下などをご覧ください。
- GNU Coreutils: install invocation
- install - FreeBSD


それでは良きサーバー構築ライフを