场景:
公司要求卸载软件时, 也包含卸载一个目录下的所有文件. 于是去修改删除文件的shell脚本, 添加了删除文件及文件夹的命令(当然是在root权限下的)
如: rm -rf /home/vito/****
但发现运行shell脚本时, 死活删除不了那个目录下的文件, 当然也就删除不了目录, 同时提示----rm: cannot remove '/home/vito/****/xxx.xxx': Permission denied.
在网上查了一下, 说这种情况下, 一般都是该文件被设置了一些不可删除的属性, 如图:
可以通过命令lsattr filename, 查看文件所以具有的属性, 从上图也可以看出, 这个文件具有 i 和 a 属性(至于这些字母代表什么意思,通过linux命令: man chattr, 可以看到英文版本)
a :设置a之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root才能设置这个属性。
i :它可以让一个文件不能被删除、改名,设置连接也无法写入或添加数据。只有root才能设置这个属性。
因此, 这个file1具有这两个隐藏属性后, 直接使用rm命令是无法删除这个文件的.
那怎么办呢, 很简单, 通过chattr命令, 修改这两个文件的属性后, 就可以正常删除了.
命令为: chattr -ia ./file1
这里 '-' 的意思表示去除, 同理, "+" 表示设置文件的属性, 如图
新情况, 即使取消了无法删除的属性, 依然无法删除文件
如图:
这是为什么, 明明删除去除了文件的不可删属性, 怎么还是删除不了文件, 连root用户都删除不了, 那还有其它用户可以删除么?
答案是不可能, 如果连root用户都删除不了的文件, 其它用户更不可能删除得了, 因此只能是其它问题引起的, 当时想了很久, 一直没有明白为什么会删除不了, 网上也没有找到想要的答案, 就这样一直耗着.
后来, 请教别人的时候, 看到别人会查看文件夹的隐藏属性, 实然之间, 就明白是什么回事了.
问题的解决
其实这个问题很简单, 就是因为当前文件的文件夹(目录)的隐藏属性是不可删除的, 因此当你要删除文件夹(目录)下面的文件时, 系统也会提示文件不可删除, 权限不足.
如图
file2文件在文件夹(目录)dir1下, 虽然file2文件已经去掉了不可删除属性, 但因为其所在的文件夹(目录)的属性也是不可删除, 最终, file2文件也因此无法删除!
解决的办法就是将当前文件所在的文件夹(目录){有时候可能不止一层文件夹(目录)被设置成了不可删除属性}的不可删除属性去掉即可, 若是有多层文件夹(目录)都具有不可删除属性, 那就需要保证每层的不可删除属性都去掉了, 之后就可以删除那一直以来删除不了的文件了
如图:
总结:
思维还是应该多发散一些, IT的逻辑还是很清晰的, 需要个人好好思考!