例えばディレクトリの作成にinstallコマンドを使う

こんなことしたいとしますよね。

mkdir -p /path/to/dir
chown 2gou /path/to/dir
chgrp oretachino /path/to/dir
chmod 700 /path/to/dir

chown 2gou.oretachino /path/to/dirでもいいけど行数稼ぐために分けた。

同じことをするには、意外と知られてないけどinstall使うと1コマンドでイナフ。

install -o 2gou -g oretachi -m 700 -d /path/to/dir

installのmanを見てみると

This install program copies files (often just compiled) into destination locations you choose. If you want to download and install a ready-to-use package on a GNU/Linux system, you should instead be using a package manager like yum(1) or apt-get(1).

とあります。このコマンドに気付いたのはrpmを作成しているときにspecファイルに書いてあったからで、specファイルを読むとinstallコマンドによるファイルコピー方法も分かります。

# Install systemd service files
mkdir -p $RPM_BUILD_ROOT%{_unitdir}
for s in httpd htcacheclean; do
  install -p -m 644 $RPM_SOURCE_DIR/${s}.service \
                    $RPM_BUILD_ROOT%{_unitdir}/${s}.service
done

例えばCentOS7のhttpdパッケージ内%installセクションですが、systemd用のファイルをコピーする時にはこんな感じで書いていたり。

コピーの部分に関しては以下の便利オプションがあるので

  • -p : コピー元のタイムスタンプはそのまま
  • -b : ファイル内容に差異があればコピー先のバックアップを取得してからコピー

別ディレクトリに取ってあるバックアップ元のファイルを元の場所に戻したりするときにも便利かなあと思ったのだけれども

  • -mを忘れるとデフォルトの755になってしまう
    • あらかじめコピー元のファイルのパーミッションを知ってないといけなくて面倒
  • 再起コピーがないのでバックアップ元が複数階層あってもと同じ階層を再現出来ない

ので、日常だと最初に書いた空ディレクトリの作成が一番重宝するかなと思います。リストアは普通にcp -aとかrsyncでやればよさそう。