タイトル: chgrp ファイル/ディレクトリのグループ情報の変更
SEOタイトル: Linux chgrp コマンド完全ガイド
| この記事の要点 |
|
chgrp の基本
chgrp (change group) はファイルやディレクトリの所有グループを変更する Linux コマンドです。実行には root 権限、または現在のファイル所有者かつ変更先グループに所属している必要があります。
# 基本: ファイルの所有グループを developers に変更
chgrp developers app.log
# 複数ファイルを一度に
chgrp developers file1.txt file2.txt file3.txt
# ワイルドカード
chgrp developers /var/log/*.log
# 確認
ls -l app.log
# -rw-r--r-- 1 alice developers 1234 Jun 11 10:00 app.log
# ↑ ↑
# ユーザー グループ
主なオプション
| オプション | 意味 | 例 |
|---|---|---|
-R / --recursive | ディレクトリ配下を再帰的に | chgrp -R www /var/www |
-h / --no-dereference | シンボリックリンク自体を対象に | chgrp -h root mylink |
-v / --verbose | 処理ごとにメッセージ表示 | chgrp -v dev *.txt |
-c / --changes | 変更があったときのみ表示 | chgrp -c dev *.txt |
-f / --silent | エラーメッセージ抑制 | chgrp -f dev *.txt |
--reference=FILE | FILE と同じグループに変更 | chgrp --reference=src dest |
-H | 引数のシンボリックリンクは辿る | (-R と併用) |
-L | 全シンボリックリンクを辿る | (-R と併用、危険) |
-P | シンボリックリンクは辿らない (既定) | (-R と併用) |
再帰的に変更 (-R)
# /var/www 以下を全て www-data グループに
sudo chgrp -R www-data /var/www
# 詳細表示
sudo chgrp -Rv www-data /var/www
# changed group of '/var/www' from root to www-data
# changed group of '/var/www/index.html' from root to www-data
# ...
# シンボリックリンクの扱い:
# -R -P : リンクは辿らない (既定、安全)
# -R -L : 全リンクを辿る (無限ループ注意)
# -R -H : コマンドライン引数のリンクのみ辿る
シンボリックリンクの扱い
シンボリックリンクへの chgrp はデフォルトでリンク先のファイルを変更します。リンク自体を変更したい場合は -h。
# 準備
echo "data" > target.txt
ln -s target.txt mylink
ls -l target.txt mylink
# -rw-r--r-- 1 alice alice 5 ... target.txt
# lrwxrwxrwx 1 alice alice 10 ... mylink -> target.txt
# 既定: リンク先の target.txt のグループが変わる
chgrp developers mylink
ls -l target.txt mylink
# -rw-r--r-- 1 alice developers 5 ... target.txt ← 変わる
# lrwxrwxrwx 1 alice alice 10 ... mylink ← 変わらない
# -h: リンク自体のグループ変更
chgrp -h developers mylink
ls -l mylink
# lrwxrwxrwx 1 alice developers 10 ... mylink ← 変わる
グループ名と GID
グループ名の代わりにGID (グループ ID) でも指定できます。/etc/group でマッピングを管理します。
# /etc/group の例
cat /etc/group
# root:x:0:
# wheel:x:10:alice
# developers:x:1000:alice,bob
# www-data:x:33:
# グループ名で指定
chgrp developers file.txt
# GID で指定 (頭に + を付ける推奨)
chgrp 1000 file.txt
chgrp +1000 file.txt
# 現在のグループを確認
ls -l file.txt
stat -c '%G' file.txt # グループ名
stat -c '%g' file.txt # GID
stat -c '%U %G %A' file.txt # ユーザー、グループ、パーミッション
所有グループを変更できる権限
| 状況 | 変更可否 |
|---|---|
| root が実行 | 常に可能 |
| ファイル所有者かつ変更先グループに所属 | 可能 |
| ファイル所有者だが変更先グループに非所属 | 不可 |
| 第三者 | 不可 |
# 自分が所属するグループを確認
groups
# alice : alice developers wheel
# alice 所有のファイルを developers グループに → OK (alice は developers 所属)
chgrp developers myfile.txt
# 自分が所属しないグループには変更不可
chgrp other_group myfile.txt
# chgrp: changing group of 'myfile.txt': Operation not permitted
# root なら可能
sudo chgrp other_group myfile.txt
chown でも同等
chown (change owner) でも、ユーザー部分を省略して :グループ と書けばグループのみ変更できます。実用上は chown の方がよく使われます。
# 以下は同じ意味
chgrp developers file.txt
chown :developers file.txt
chown .developers file.txt # 古い書き方
# chown はユーザーとグループを同時変更できる
sudo chown alice:developers file.txt
# 再帰でユーザーとグループ両方
sudo chown -R www-data:www-data /var/www
典型的な使用例
Webサーバのドキュメントルート
# Apache / Nginx のグループ (www-data / nginx) に統一
sudo chgrp -R www-data /var/www/html
sudo chmod -R g+r /var/www/html
sudo chmod -R g+w /var/www/html/storage # 書き込み必要なディレクトリのみ
# ★ Laravel の場合
sudo chgrp -R www-data /var/www/laravel-app
sudo chmod -R 775 /var/www/laravel-app/storage
sudo chmod -R 775 /var/www/laravel-app/bootstrap/cache
共有作業ディレクトリ
# 開発チームで共有するディレクトリ
sudo mkdir /srv/shared
sudo chgrp developers /srv/shared
sudo chmod 2775 /srv/shared
# ↑↑ Set GID bit (2): 作成ファイルが親と同じグループになる
# 新規ファイルを作ると自動で developers グループに
touch /srv/shared/test.txt
ls -l /srv/shared/test.txt
# -rw-r--r-- 1 alice developers ... test.txt ← 自動で developers
ログファイルのアクセス権付与
# adm グループに syslog を読ませる
sudo chgrp adm /var/log/syslog
sudo chmod g+r /var/log/syslog
# adm グループのメンバーは sudo なしで読める
groups alice
# alice : alice adm wheel
cat /var/log/syslog # OK
確認系コマンド
# 所有グループを確認
ls -l file.txt # 詳細形式
ls -lg file.txt # GNU 拡張
stat file.txt # 全メタ情報
stat -c %G file.txt # グループ名のみ
stat -c %g file.txt # GID のみ
stat -c "%U:%G %a %n" file.txt # フォーマット
# グループに属するメンバー
getent group developers
# developers:x:1000:alice,bob
# 自分が所属するグループ
groups
id
id -gn # プライマリグループ名
id -Gn # 全グループ
関連コマンド
| コマンド | 用途 |
|---|---|
chmod | パーミッション (rwx) 変更 |
chown | 所有者 / グループ変更 |
chgrp | 所有グループのみ変更 |
groupadd | 新規グループ作成 |
groupdel | グループ削除 |
usermod -aG グループ ユーザー | ユーザーをグループに追加 |
gpasswd -d ユーザー グループ | ユーザーをグループから削除 |
getfacl / setfacl | ACL (詳細権限) |
SELinux / AppArmor との関係
chgrp は伝統的な UNIX パーミッション (DAC) を操作しますが、SELinux / AppArmor のようなMAC (強制アクセス制御)は別レイヤーで動きます。グループを正しく設定しても SELinux ラベルが間違っていればアクセス拒否されます。
# SELinux のコンテキストを確認
ls -lZ /var/www/html/index.html
# -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 ... index.html
# ↑ SELinux ラベル
# ラベルを修正
sudo restorecon -Rv /var/www/html
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
# AppArmor は /etc/apparmor.d/ のプロファイルで制御
sudo aa-status
FAQ
Q: chgrp と chown :group、どちらを使うべき?
A: 機能は同じ。スクリプトで意図を明示したい場合は chgrp、ユーザーとグループ両方変えるなら chown user:group。
Q: 大量のファイルを変更したら遅い
A: -R でも数百万ファイルは時間かかります。find ... -exec chgrp ... + または xargs で並列化可能。
Q: シンボリックリンクのリンク先を変えたくない
A: 必ず -h を付ける。chgrp -h newgroup mylink。-R と組み合わせるときは -RhP。