次の場合ls -alh
total 0
drwxrwx--- 1 user http 20 Nov 30 08:08 .
drwxrws--- 1 user http 310 Nov 30 08:07 ..
drwx------ 1 http http 10 Nov 30 08:08 empty-subdir
drwx------ 1 http http 12 Nov 30 08:08 non-empty-subdir
その中には2つのサブディレクトリ(私が所有していない)があり、次のようにリストしました。
sudo ls empty-subdir -alh
total 0
drwx------ 1 http http 10 Nov 30 08:08 .
drwxrwx--- 1 user http 20 Nov 30 08:08 ..
sudo ls non-empty-subdir -alh
total 0
drwx------ 1 http http 12 Nov 30 08:08 .
drwxrwx--- 1 user http 20 Nov 30 08:08 ..
drwx------ 1 http http 0 Nov 30 08:08 subdir
2つのサブディレクトリの違いは、空でないサブディレクトリにnon-empty-subdir
フォルダが含まれていることです。
私の質問は、rm -rf
サブディレクトリを削除する試みが意図的なものかどうかです。結果は次のとおりです。
$ rm empty-subdir -rf
$ rm non-empty-subdir -rf
rm: cannot remove 'non-empty-subdir': Permission denied
$ ls -alh
total 0
drwxrwx---+ 1 user http 10 Nov 30 08:14 .
drwxrws---+ 1 user http 310 Nov 30 08:07 ..
drwx------+ 1 http http 12 Nov 30 08:08 non-empty-subdir
ディレクトリへの書き込みアクセス権を持つユーザーは、ファイルエントリを削除したり、他のユーザーのために空のサブディレクトリを削除したりすることはできますが、削除することはできないようです。空ではないサブディレクトリ。
この質問に対する理想的な答えは、次の情報を提供します。
- 説明された動作が他のコンピュータで再現可能であることを確認する(ただ私が台無しにした箱の問題ではない)
- 動作の根拠を説明します(例:ユースケースはありますか?)
- システム(BSD、Linux ...)の違いがあるかどうか概要
修正する:Ipor Sircerのコメントに関して、ACL機能なしでシナリオを再テストしましたが、結果は同じでした。したがって、+
アクションがACLに関連する可能性があるという考えを避けるために、リストからesを削除するように質問を修正しました。
ベストアンサー1
rmdir()
ディレクトリは空の場合にのみシステムコールを介して削除できます。
rm -r dir
ディレクトリツリーの葉から始めてルート()まで作業しながら、ディレクトリとその中のすべてのファイルを削除しますdir
。
ファイルを削除するには(ディレクトリやその他の種類rmdir()
のunlink()
ファイルや*at()
バリエーションの場合)、重要なのはファイル自体の権限ではなく、ファイルが削除されるディレクトリの権限です(t
権限のビットに注意してください。/tmp
より複雑になります)。
まず、実際には削除しません。文書、ディレクトリからリンクを解除します(ファイルが削除したい最後のリンクになると最終的に削除されます)。つまり、ディレクトリを変更するので、次のものが必要です。改訂する(書き込み) ディレクトリに対する権限です。
削除できない理由は、変更権限がないため、最初に接続を解除non-empty-dir
できないためです。そのホームディレクトリに対する書き込み/変更権限があるため、そのホームディレクトリから切断する権限があります。空でないディレクトリを削除しないでください。subdir
non-empty-dir
non-empty-dir
あなたの場合、@PeterCordesがコメントで指摘したように、エラーコードでrmdir()
システムコールが失敗しますENOTEMPTY
が、そうではありません。読むディレクトリの権限は、空にするためにリンクを解放する必要があるファイルとディレクトリ(含まれている)を特定することはできrm
ません(書き込み権限がないため、知っていればリンクを解除することはできません)。subdir
次のような状況が発生する可能性があります。rm
できる書き込み専用の場合と同様に、ディレクトリにどのファイルが含まれているかを判断できる場合は、ディレクトリを削除してください。
$ mkdir dir
$ touch dir/file
$ chmod a=,u=wx dir
$ ls -ld dir
d-wx------ 2 me me 4096 Nov 30 19:43 dir/
$ rm -rf dir
rm: cannot remove 'dir': Permission denied
それでも、そのファイルにはファイルが1つしか含まれていないことがわかったので、削除できましたfile
。
$ rm dir/file
$ rmdir dir
$
また、最新のUnicesでは名前を変更できますが、non-empty-dir
LinuxやFreeBSD(Solarisではない)などの一部のシステムではいいえ次のように、そのディレクトリへの書き込みアクセス権がある場合でも、別のディレクトリに移動します(私の考えでは、Linuxでは提案されているように)。関連コードの説明)これを行うには修正が必要ですnon-empty-dir
(..
その中のエントリは別のディレクトリを指します)。
あなたを削除すると、その中のアイテムempty-dir
も削除されるので、修正する必要があると言うかもしれませんが、システムはまだそうすることができます。..
.