InfraAcademy

InfraAcademy Blog

【Linux】ディレクトリやファイルを削除するときに”permission denied.”のエラーが出る時の対処方法を解説

| #Linux

こんにちは、フルスタックエンジニアのryuです。

Linuxでファイルを削除したら、Permission deniedと表示された。

rm -fsudoを付けるべきか迷いますよね?

やみくもに権限を広げてはいけません。

Linuxでは、親ディレクトリの権限が削除に関係します。

この記事では、Permission deniedの原因と、安全な切り分け手順を解説します。

Permission deniedとは?

Permission deniedは、現在のユーザーに操作権限がないことを表します。

ファイルを削除する場合は、次のように表示されます。

rm sample.txt
rm: cannot remove 'sample.txt': Permission denied

ファイル削除は名前をディレクトリから外す操作

Linuxのファイル削除は、親ディレクトリから名前を取り除く操作です。

削除には、親ディレクトリのwxが必要です。

例えば/var/www/app/sample.txtを削除する場合は、親の/var/www/appに対する権限が重要です。

ファイル自身が読み取り専用でも削除できる場合がある

次のファイルには、所有者の書き込み権限がありません。

-r--r--r-- 1 user1 user1 100 Jul 15 10:00 sample.txt

親ディレクトリに権限があれば削除できます。

反対に、親ディレクトリへ書き込めなければ削除できません。

最初に確認すること

Permission deniedが出たら、すぐにchmod 777sudo rm -rfを実行しないようにしましょう。

現在地、実行ユーザー、親ディレクトリの順に確認します。

削除対象と現在地を確認する

最初に、どの場所で何を削除しようとしているのか確認します。

pwd
ls -la

絶対パスでも削除対象を表示します。

ls -ld /path/to/directory
ls -l /path/to/directory/sample.txt

現在のユーザーと所属グループを確認する

現在のユーザーは、idで確認できます。

id

実行結果の例です。

uid=1001(user1) gid=1001(user1) groups=1001(user1),1002(developers)

対象の所有グループに所属しているか確認します。

親ディレクトリの権限を確認する

ls -ldで、親ディレクトリ自身の権限を表示します。

ls -ld /var/www/app
drwxr-xr-x 2 root root 4096 Jul 15 10:00 /var/www/app

この例では、書き込み権限があるのはrootだけで、一般ユーザーは削除できません。

パスの途中に権限不足がないか確認する

パスの途中にある各ディレクトリへもアクセスできる必要があります。

途中のどこかにx権限がなければ、対象へ到達できません。

nameiコマンドで階層を確認する

namei -lを使うと、パスを階層ごとに確認できます。

namei -l /var/www/app/sample.txt
f: /var/www/app/sample.txt
drwxr-xr-x root root /
drwxr-xr-x root root var
drwxr-x--- root web  www
drwxrwx--- user web  app
-rw-r----- user web  sample.txt

各階層を通過できるか確認します。

ACLが設定されていないか確認する

rwx表示だけでは、ACLによる追加設定が分からない場合があります。

ファイル名の権限表示に+が付いていたら、ACLを確認しましょう。

drwxrwx---+ 2 user1 developers 4096 Jul 15 10:00 app

確認にはgetfaclを使います。

getfacl /var/www/app

ACLで現在のユーザーに権限が与えられているか、マスクによって権限が制限されていないかを確認します。

権限不足を修正する方法

原因が権限や所有者なら、必要な範囲だけ修正します。

全ユーザーへ権限を与える必要はありません。

所有者が間違っている場合

本来、そのディレクトリを管理するユーザーが所有者になるべき場合は、chownで変更します。

sudo chown user1:developers /var/www/app

ディレクトリ以下も変更する場合は-Rを付けますが、対象範囲に注意してください。

sudo chown -R user1:developers /var/www/app

実行前に、現在地と対象パスを確認しましょう。

pwd
ls -ld /var/www/app

【関連記事】Linuxのchownコマンドの使い方

グループへ書き込み権限を追加する場合

複数ユーザーで管理するディレクトリなら、所有グループとグループ権限を調整します。

sudo chown :developers /var/www/app
sudo chmod g+rwx /var/www/app

変更後はdevelopersグループへの所属を確認します。

id user1

chmod 777を避ける

chmod 777は、すべてのユーザーへ全権限を許可します。

本来変更できないユーザーまで削除できる状態になります。

chmod 777 /var/www/app

所有者やグループを確認し、必要な権限だけを追加しましょう。

【関連記事】Linuxのファイル権限とchmodの使い方

rm -fでは権限エラーを解決できない

元記事のrm -rfでは、アクセス権限を突破できません。

-fは、存在しないファイルのエラーを無視し、確認を表示しないためのオプションです。

-rと-fの違い

-rは、ディレクトリの中を再帰的に削除します。

rm -r directory/

-fは、削除確認を行わず、存在しないファイルをエラーにしません。

rm -f sample.txt

親ディレクトリに権限がなければ、rm -fでも解消しません。

rm -rfを安易に実行しない

rm -rfは、指定したディレクトリ以下を確認なしで削除します。

パスを間違えると、必要なファイルまで削除されます。

削除前に、対象を一覧表示してください。

pwd
ls -la /path/to/directory

対話形式で確認しながら削除する場合は、-iを使えます。

rm -ri /path/to/directory

【関連記事】Linuxのrmコマンドの使い方

sudoを使って削除する前の注意点

管理者所有のファイルでは、sudoが必要な場合があります。

ただし、Permission deniedが出たからという理由だけでsudoを付けるのは危険です。

本当に削除してよいファイルか確認する

最初に、所有者と用途を確認します。

ls -ld /path/to/directory
ls -l /path/to/directory

設定、データベース、ログなどではないか確認します。

必要性を確認したうえで削除します。

sudo rm /path/to/file

サービスが管理するファイルは停止手順を確認する

サービスが利用するファイルを削除すると、正常に動かなくなる可能性があります。

サービス側の削除手順も確認しましょう。

エンジニアとして10年以上サーバーを扱っていますが、sudoの前に削除できない設計理由を確認します。

権限以外で削除できない原因

権限表示が正しくても、Operation not permittedRead-only file systemで削除できない場合があります。

ここでは、代表的な原因を確認します。

スティッキービットが設定されている

/tmpのような共有ディレクトリには、スティッキービットが設定されています。

ls -ld /tmp
drwxrwxrwt 10 root root 4096 Jul 15 10:00 /tmp

末尾のtがスティッキービットです。

共有ディレクトリでも、通常はファイル所有者などだけが削除できます。

他人のファイルでは、Operation not permittedになることがあります。

immutable属性が設定されている

ファイルにimmutable属性が設定されていると、rootでもそのままでは削除できません。

確認にはlsattrを使います。

lsattr important.conf
----i-------------- important.conf

iがimmutable属性です。

解除してよいか確認してから変更します。

sudo chattr -i important.conf

その後、必要な操作を行います。

ファイルシステムが読み取り専用になっている

次のエラーでは、ファイルシステムが読み取り専用になっています。

rm: cannot remove 'sample.txt': Read-only file system

対象が置かれているマウントポイントを確認します。

findmnt -T sample.txt

OPTIONSroがあれば読み取り専用です。

障害で読み取り専用になった可能性もあるため、原因を確認せず再マウントしないようにします。

使用中のファイルは削除できる?

Linuxでは、使用中のファイルでも多くの場合は削除できます。

そのプロセスがファイルを閉じるまで、使用していたディスク領域は解放されません。

使用中であることはPermission deniedの一般的な原因ではない

Windowsなどの動作とは異なり、Linuxでは使用中という理由だけでrmが拒否されるとは限りません。

使用中なら削除できない、という元記事の説明は修正しました。

削除したのにディスク容量が戻らない場合は、削除済みファイルを開いているプロセスを確認します。

sudo lsof +L1

プロセスをむやみに終了せず、サービスへの影響を確認してください。

Permission deniedの確認手順まとめ

ファイルやディレクトリを削除できない場合は、次の順番で確認します。

  1. pwdlsで削除対象を確認する
  2. idで現在のユーザーとグループを確認する
  3. ls -ldで親ディレクトリの権限を確認する
  4. namei -lで途中のディレクトリを確認する
  5. 必要に応じてACL、スティッキービット、属性を確認する
  6. findmnt -Tで読み取り専用ではないか確認する
  7. 必要最小限の権限や所有者だけを変更する

削除できないからといって、rm -rfchmod 777sudoを順番に試すのは危険です。

どの権限や設定が削除を止めているのか確認してから、必要な部分だけを修正しましょう。

Linuxの権限を実際に学びたい方へ

InfraAcademyでは、ブラウザ上のLinux環境でファイルを作成し、所有者や権限を変更しながら学習できます。

基本的なファイル操作から学びたい方は、Linux入門講座を確認してみてください。

権限、ユーザー、グループ管理まで学びたい方は、Linux中級講座がおすすめです。

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

InfraAcademy運営 / エンジニア

エンジニア歴10年。Linux、ネットワーク、クラウドを中心に、実務で役立つインフラ技術を初心者にもわかりやすく解説しています。

X: @ryu63614894

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る