作为Linux系统管理员或者软件开发人员,当你使用rm命令删除文件之后发现该文件依然有用但无法恢复,或者使用 ‘rm -rf’强制误删了某些文件时,是否为此感到痛苦不堪。是否苦恼于Linux缺乏类似Windows系统的回收站。虽然某些Linux图形界面具有回收站功能,但是在命令行中依然缺乏回收站功能的支持。本文通过shell脚本实现一个回收站命令trash,提供基于Linux系统命令行的回收站功能,让误删的文件能够恢复如初。在多数情况下,你可以使用trash命令替代rm命令进行删除文件操作。此命令可运行在带bash的Linux server、Linux桌面系统、嵌入式Linux系统上。

回收站功能简介

通过usage函数显示trash命令的帮助信息。

function usage(){echo "Function: Put files or directories in trashcan."echo "Usage: trash [OPTION]... FILE..."echo "Options:"echo "    -h | -help        Show the help mesage"echo "    -t | -trash       Move contents to trashcan"echo "    -f | -force       Delete contents forcely"echo "    -l | -list        List contents in trashcan"echo "    -r | -restore     Restore the contents in trashcan"echo "    -d | -delete      Delete contents from trashcan"echo "    -e | -empty       Empty trashcan"    echo "    -c | -config      Configure crontab task,empty trashcan regularly"}

执行trash -h或者trash不带参数时,显示trash命令帮助信息如下:

trash命令删除文件时,实际上是将文件移动到用户根目录的trashcan目录中,同时将文件名、删除时间、原始路径记录在.record隐藏文件中;通过trash -r选项可将文件从回收站中恢复到原始路径;确信文件可删除的情况下,可使用trash -f进行彻底删除操作;trash -d和-e选项用于清除回收站中文件;执行trash -c将清理回收站指令添加到crontab任务中,系统会定期自动清理回收站。

初始化

运行trash命令时,首先进行初始化,代码片段如下:

PATH_TRASHCAN=~/trashcan
PATH_RECORD=$PATH_TRASHCAN/.record
PATH_CRON=/var/spool/cron
function init(){if [ ! -d $PATH_TRASHCAN ]thenmkdir $PATH_TRASHCANchmod 600 $PATH_TRASHCANfi
}

定义回收站目录,用于存放删除的文件或者文件夹。Trash命令在当前用户根目录中新建trashcan目录来存放文件。如代码所示,init函数首先判断trashcan目录是否存在,如果不存在,则新建该目录且将trashcan目录权限设置为当前用户可读写,禁止其他用户对trashcan目录的访问权限。

参数判断以及处理

初始化完成之后,需要对trash命令的参数进行判断和处理。

    if [ $# -ge 1 ]then    declare param=()param_circle=0for i in $@; doparam[param_circle]=$iparam_circle=$(($param_circle+1))doneunset param[0]      case "$1" in-h)usage;;-t)         trash    ;;-f)force;;-l)list;;-r)restore;;-d)delete;;-e)empty;;            -c)config ;;-o)cron_delete ;;*)echo "$1 is not an option"usage;;esacelseusage
fi

首先判断trash命令输入的参数个数,如果小于1,则调用usage函数提示用户trash命令的正确使用方法。如果大于等于1,证明trash命令使用方式合法,此时将所有参数存放到param数组中,使用unset param[0]删除第一个参数,保留所有文件名内容在param数组。接下来根据第一个参数的值,分别调用相应的函数。

删除文件到回收站

功能说明

  • 当输入trash -t 时调用trash函数将文件移动到回收站。判断param数组长度,如果小于1说明trash -t后没有指定被删除文件名称;如果大于等于1则循环处理输入的所有文件。
  • 当文件、文件夹大于200M时对其进行强制删除,考虑到大多数嵌入式平台Flash存储空间非常有限。
  • 给被删除文件添加时间戳,目的是通过时间戳区别同名文件且能够清晰显示删除时间。
  • 获取被删除文件的原始路径,以便从回收站恢复。
  • 调用record函数记录删除文件信息。
  • 通过mv命令将文件移动到trashcan目录中。
function trash(){if [ ${#param[@]} -lt 1 ]thenecho "Please input the files you want to trash!"echo ">trash -t [file1]..."elsefile_circle=1TotalFileSize=0for file in ${param[@]}doif [ -f "$file" ] thenfileSize=`ls -l $file|awk ' {print $5}'` if [ $fileSize -gt $(( 200*1024*1024 )) ]thenecho "$file size is larger than 200M, will be deleted directly"`rm -rf $file`unset param[$file_circle]elseTotalFileSize=$[TotalFileSize+fileSize]fielif [ -d "$file" ] thendirSize=`du -sb $file|awk '{print $1}'`if [ $dirSize -gt $(( 200*1024*1024 )) ]thenecho "dir: $file size is larger than 200M, will be deleted directly"`rm -rf $file`unset param[$file_circle]elseTotalFileSize=$[TotalFileSize+dirSize]fififile_circle=`expr $file_circle + 1`        done        for file in ${param[@]}docurrentTime=`date +%Y-%m-%d_%H:%M:%S`trashFile="${file##*/}_${currentTime}"trashPath="$(pwd)/$file"        if mv -f $file $PATH_TRASHCAN/$trashFilethen record $trashFile $trashPathecho "$file is trashed"fidone        fi
}

record函数

将带有时间戳的文件名以及文件的原始路径记录在~/trashcan/.record文件中。

PATH_RECORD=$PATH_TRASHCAN/.record
function record(){if [ ! -f $PATH_RECORD ]then touch $PATH_RECORDchmod 644 $PATH_RECORDfiecho $1 $2>> $PATH_RECORD
}

强制删除

如果想要彻底删除文件可以使用trash -f,调用force函数通过rm -rf命令强制删除文件或者目录。

function force(){rm -rf ${param[@]}
}

使用示例如下:

通过ll -a ~/trashcan显示trashcan目录为空。trash_test为删除文件的原始目录,其中具有file1和file2两个文件。执行trash -t file1 file2将file1和file2删除到回收站trashcan中,执行后可以发现回收站中产生了file1和file2带时间戳的文件,同时trash_test目录中相应的文件消失。

显示回收站内容

function list(){cat $PATH_RECORD
}

通过trash -l命令可随时随地查看回收站内容,不用访问回收站目录去查看。可以看到所有删除的文件名、删除时间、原始路径。

恢复文件

  • 输入trash -r [FILE]将FILE文件恢复到原始路径。
  • 首先判断trash -r后面是否输入了文件名,若没有则提示用户输入。
  • 从.record文件中找到恢复文件的原始路径。
  • 通过mv将文件移动到原始路径。
  • 同时将恢复的文件记录从.record文件中删除。
function restore(){if [ ${#param[@]} -lt 1 ]thenecho "Please input the files you want to restore!"echo ">trash -r [file1]..."elsefor file in ${param[@]}dorestorePath=$(awk /$file/'{print $2}' $PATH_RECORD) fileRestore=$(awk /$file/'{print $1}' $PATH_RECORD)$(mv  $PATH_TRASHCAN/$fileRestore $restorePath)echo "$fileRestore is restored to $restorePath"$(sed -i /$fileRestore/'d' $PATH_RECORD)donefi
}

使用示例如下:

通过以上示例可以发现回收站中具有file1和file2两个带有时间戳的文件,且.record中记录了原始路径,此时trash_test目录为空。执行trash -r file*命令恢复所有file开头的文件,成功恢复了file1和file2文件,且删除了.record中的记录信息。

清理回收站

手动删除

  • 通过trash -d删除指定文件。
  • Delete函数首先判断trash -d是否指定了文件。如果为空则提示用户输入想要删除的回收站中文件。
    反之,循环处理文件。使用rm -rf彻底删除文件或者文件夹。
  • 同时将文件记录从.record文件中删除。
function delete(){if [ ${#param[@]} -lt 1 ]thenecho "Please input the files you want to restore!"echo ">trash -d [file1]..."elsefor file in ${param[@]}dofileDelete=$(awk /$file/'{print $1}' $PATH_RECORD)$(rm -rf $fileDelete)echo "$fileDelete is deleted"$(sed -i /$fileDelete/'d' $PATH_RECORD)donefi
}

清空回收站

  • 通过trash -e命令清除回收站中所有内容。
  • Empty函数调用rm -rf删除~/trashcan目录中的所有文件以及隐藏文件.record。
function empty(){rm -rf $PATH_TRASHCAN/*rm -rf $PATH_RECORD
}

crontab自动清理

  • 配置crontab任务,每隔30分钟删除回收站中存放时间大于7天的文件。
  • 执行trash -c将定期清除回收站文件的指令加入到crontab中。
  • 通过crontab -l新建用户cron文件。
  • 设置为每隔30分钟执行一次清理操作,该时间可灵活调整。
echo "*/30 * * * * trash -o $regularTime " >> $PATH_CRON/$USER
  • trash -c后参数为天数,如果为空则默认每隔30分钟删除回收站中存放超过7天的文件,否则删除超过指定天数的文件。
    配置crontab任务函数config代码清单:
function config(){if [ ${#param[@]} -lt 1 ]then regularTime=7elseregularTime=${param[1]}ficrontab -l > $PATH_CRON/$USER# echo "* * * * * echo "delete files which were older than $regularTime days">`tty` " >> $PATH_CRON/$USER$(sed -i /trash/'d' $PATH_CRON/$USER)echo "*/30 * * * * trash -o $regularTime " >> $PATH_CRON/$USERcrontab $PATH_CRON/$USERcrontab -l}

定期清除函数:

function cron_delete(){if [ ${#param[@]} -lt 1 ]then regularTime=7elseregularTime=${param[1]}fiarrayCron=($(find $PATH_TRASHCAN/* -mtime +$regularTime))for file in ${arrayCron[@]}do$(rm -rf $file)fileRecord="${file##*/}"$(sed -i /$fileRecord/'d' $PATH_RECORD)done
}

使用示例如下:

终端显示*/30 * * * * trash -o 8则表示该任务已成功添加到crontab中。
注意:
PATH_CRON=/var/spool/cron
该路径需根据用户系统实际路径更改。例如:ubuntu实际路径为/var/spool/cron/contabs。

总结

本文使用shell脚本实现了简易的命令行Linux回收站功能。用户只需将trash脚本拷贝到Linux环境变量目录中,给予执行权限,即可使用该功能,建议使用trash命令替代rm命令进行删除操作,减少误删造成的损失。

源码地址:https://github.com/IOT-er/trashcan

Linux回收站的设计与实现相关推荐

  1. trash-cli设置Linux 回收站

    trash-cli 设置 Linux 回收站 trash-cli是一个使用 python 开发的软件包,包含 trash-put.restore-trash.trash-list.trash-empt ...

  2. linux课程设计死锁避免,linux操作系统课程设计—车辆死锁.doc

    linux操作系统课程设计-车辆死锁.doc 键入文字"操作系统原理"课程设计BX090709吴沛儒操作系统原理课程设计报告姓名吴沛儒班级BX0907学号9指导老师胡静二〇一一年十 ...

  3. 101个脚本之linux回收站

    众所周知,linux是没有回收站的,一些人很害怕删错东西(有经验的linux管理员极少范这错误),个人不建议回收站,而应该是培养个人的安全意识.有点小跑题. 接着回来101个脚本之#15 Archiv ...

  4. linux的内核设计,Linux内核设计艺术(经典).pdf

    <Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理>内容简介:很早就有一个想法,做中国人自己的.有所突破.有所创新的操作系统.计算机语言及编译平台.我带领的"新 ...

  5. 嵌入式linux开发课程设计,嵌入式Linux开发课程设计指导书

    嵌入式Linux开发课程设计指导书 课程编码: 适应专业:计算机专业.电子信息工程专业 学时:3周(计算机专业),2周(电子信息工程专业) 学分: 3(计算机专业),2(电子信息工程专业)时间安排:分 ...

  6. linux 设计与实现 pdf,Linux库的设计与实现.pdf

    Linux库的设计与实现 一.为什么要使用库文件 我们在实际编程工作中肯定会遇到这种情况:有几个项目里有一些函数模块的 功能相同, 实现代码也相同,也是我们所说的重复代码.比如,很多项目里都有一个用户 ...

  7. Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理

    为什么80%的码农都做不了架构师?>>>    Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理 本书使用高分辨率精心绘制的300多张图片,帮助大家理解操作系统特有 ...

  8. 打造Linux回收站

    linux是没有回收站概念的,一旦误删除文件了是很难很难找回来的,对普通用户而言误删除文件就等于永久性不可逆丢失数据了:不过可以改造一下rm命令来变相实现回收站功能,实际上就是mv命令转移文件到指定路 ...

  9. 基于嵌入式Linux的无线路由器设计——Bridged Adapter网桥模式

    现在嵌入式设备联网,主要有两种模式:以太网RJ-45 接口直接插网线上网:3G/4G 模块拨号上网.随着无线终端设备的不断普及,手机平板等无线设备对网络的需求也日益增加.本篇文章主要介绍基于嵌入式Li ...

最新文章

  1. RBL, UBL, Uboot的关系
  2. 链表有环是什么意思_互联网大厂offer收割之单向链表的概念及面试题大全
  3. 虚拟化概念和KVM简述
  4. 【LeetCode】拓扑排序
  5. 计算机配件推荐系统论文摘要,个性化推荐系统设计
  6. bzoj3210: 花神的浇花集会
  7. 【iOS开发】实现App内替换图标
  8. 软件测试——白盒测试
  9. redis配置文件下载
  10. 【存储】超融合(HCI)和云是什么以及区别|超融合和虚拟化的区别
  11. python刷题记录:买帽子
  12. android studio实现记住密码,Andriod Studio实现保存QQ密码功能(案例代码详解)
  13. jmeter+ANT接口自动化环境的搭建以及测试报告的优化
  14. Python告诉你NBA球星都喜欢在哪个位置出手?
  15. python itchat实现微信自动回复
  16. 2021年编程课程网盘资料大汇总,限时领取!
  17. 如何复制CD音乐(电脑小技巧)
  18. 【计算机图形学】实验报告1用OpenGL画线命令绘制一个多边构成图形或场景
  19. 小白科研笔记:简析图神经网络收敛性的理论证明
  20. iOS 获取WKWebView内容高度做H5原生连接

热门文章

  1. linux安装testlink步骤,Linux下安装testlink
  2. [视频]学打羽毛球41-45
  3. android调用系统相机并获取图片
  4. 文件保险箱 v4.0 绿色
  5. i7 12700k和i7 12700的区别 i712700k和12700性能差距
  6. 如何识别哭泣csdn_AI实战 | 最适合初学者的人脸识别入门教程
  7. Do not hardcode /sdcard/
  8. 零售云四年业绩亮眼 苏宁易购迎来价值重估
  9. 支付宝支付 开放平台设置以及公钥私钥生成配置
  10. North America - Greater NY 2012