在 ext4 文件系统上,我有一个base
目录,它本身有三个目录a
、b
和c
,并且每个目录里面都有各种内容。
我设置chattr +a base
然后执行rm -r base
。然后我发现a
,,还在。太好了。然后我发现它们都变成了空的。我哭了b
。c
发生了什么?
答案1
我不明白你为什么对此感到惊讶。目录只是一个文件。目录条目是指向文件的指针。当你chattr +a
在 base 上设置时,你只会影响 base,因此你不能从中删除条目。目录a
、b
和c
也是文件,但它们不受 属性的影响,base
但你不能从 中删除它们base
。
答案2
chattr
用于更改Linux文件系统上的文件属性。
因此,当您使用chattr +a
它时只会影响base
目录本身以及子目录和文件直接位于其下方。
为什么?
术语“目录”在计算机软件环境中用于指代在用户看来是容器或者文件夹可以保存文件和其他目录。
在 Linux 和其他类 Unix 操作系统中,系统上的所有内容都被视为文件,因此目录仅被视为包含文件名列表的特殊文件类型 以及它所包含的每个文件和目录的相应 inode 似乎包含。inode 是文件系统上的数据结构,它存储了文件除名称和实际数据之外的所有信息。
因此,将目录一词视为术语的缩写可能会有所帮助目录文件。虽然从技术上讲可能有些多余,但使用以下表达方式很方便且很常见: 文件和目录当引用目录的内容时;另一种方法是文件系统对象。
参考:http://www.linfo.org/directory.html
当您使用 时rm -r base
,它会递归运行(-r 选项)并尝试删除所有文件和子目录及其内容,但无法删除基本目录及其直接下的目录和文件。但它成功删除了子目录下的文件。
至于a
(append) 属性,您可以毫无问题地在其下添加目录和文件,但不能删除或重命名它们。对我来说,它表现得非常完美,就像文件以及其下的子目录和文件。
您想要实现的目标是保护目录及其下的所有子目录和文件,您应该使用选项为每个子目录和文件-R
设置或添加属性Recursively
。如此处所述:http://linux.die.net/man/1/chattr
答案3
“a”属性只能应用于文件(一旦应用,它们只能以追加模式打开以进行写入)。将此属性应用于目录的行为尚未定义。