| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 在linux下用shell实现类似windows回收站的功能 -> 正文阅读 |
|
[系统运维]在linux下用shell实现类似windows回收站的功能 |
使用linux时,经常会执行rm -rf命令,但是这一命令是有风险的,例如,执行某个shell脚本,shell脚本中有如下语句:
此时,如果因为某项设置,导致环境变量SOME_PATH为空,则会直接把HOME目录下的所有内容清空。我在使用开发套件进行开发时,也出现过误删某一项目,导致本地和远程分支的代码一同被删除的问题,废了好大的劲才找到commit id恢复过来,和同事吐槽这一点的时候,同事表示自己做了个回收站功能,我一时兴起,也尝试做了个简单的回收站。 要实现一个类似windows回收站的功能,需要考虑以下问题:
这个功能并不难实现。 该功能主要分为两个部分,分别为remove.sh和recover.sh,其共同操作一个recycle目录以及一个meta文件,对于两者公用的变量,放在init.conf中。 将文件移到回收站
remove.sh接受的参数形式与rm命令相同。 shell脚本中的
变量${TRASH}和${TRASH_META}定义在init.conf中,为避免回收站目录被误删,我们将其设置为隐藏目录。回收站的上级目录最好设置为一个硬盘较大且有权限的目录,简单起见,这里设置为$HOME:
整个脚本简单明了,唯一需要考虑的是“自删除”问题,即禁止该脚本删除recycle目录。 将文件从回收站中恢复
recover.sh接受若干个参数,每个参数均为一个md5值,若该md5值不存在,或者md5值对应的原文件不存在,则会报错。由于md5至多出现一次,因此我们直接通过grep+sed的组合命令定位到原始文件的绝对路径。 恢复的过程中我们加了一个额外的检测:假设我们要恢复${HOME}/test/1这个文件,但是test目录已经被删除,此时执行mv命令是会报错的,正确做法是如果发现目录不存在,则通过mkdir -p命令递归创建后再执行mv命令。这里假定mv命令出错的原因是目录不存在,其实是不够robust的,对于其它错误(比如硬盘空间不足),并没有进行处理。 其它操作初始化脚本执行环境我们希望用户能在任意地方都能执行这一命令,因此可以考虑将其加入到用户的环境变量中。假定remove.sh, recover.sh, init.conf都在remove目录下,那么在该目录下新建一个export.sh,以初始化环境变量:
定时清空回收站随着时间不断推移,回收站占据的空间势必会越来越大。从需求来看,我们最初执行rm命令,就是为了永久删除某个文件,回收站只是为了恢复极少数出现的误删的文件,一个庞大而臃肿的回收站并不是我们愿意看到的。因此,可以考虑增加一项定时任务,来定期清理回收站。例如,自动清理回收站中超过7天的文件。
clean_recycle.sh是在脚本里写死了清空7天前的文件,如果想调整的话,还要改脚本,其实显得不是很灵活,更好的方式是按参数传递,或者写在init.conf中,这里图省事,就没考虑那么多了。 脚本中的rm命令是有风险的:如果${TRASH}变量被其它程序清空,那么rm命令就会把根目录一同删除,因此在rm前必须要检测被删除的md5文件是否存在。 这个脚本可以以定时任务或者后台任务的方式存在,考虑到实际开发环境中,后台进程经常会因为各种原因被kill掉,因此以定时任务的方式,每天凌晨运行一遍:
最后,remove.sh也是有可能会被rm命令给删除的,一个比较trick的方式是用chattr命令使其只读:
改为只读模式后,即便sudo rm也无法删除这些文件。 至此,一个简单的linux回收站功能实现完毕。 github地址见linux_recycle |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 3:28:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |