Linux下防止rm -frv 删除错误的解决办法
今天本想删除~目录下datas里面的“MMM”文件夹;当进入到datas目录下时,不小心把命令写成了:rm -frv * MMM/【正确的应该是将* 写成rm -frv MMM/* ,不知怎么搞得,就把* 写到MMM前面去了,哎真不知道当时咋了!!!】,之后用了一些数据恢复工具例如extundelete,xfs_irecover等工具均未能成功恢复!经过此处教训之后,总结以下几点:
Linux下防止rm -frv 删除错误的解决办法:
一、重命令rm 命令
定义alias rm='rm -i',删除时会有提示,建议这样子修改,删除时能够确认;
二、改造rm ,删除到回收站
# 修改rm
alias rm=trash
alias r=trash
alias rl='ls ~/.trash/'
alias ur=recoverfilerecoverfile()
{mv -i ~/.trash/$@ ./
}trash()
{mv $@ ~/.trash
}修改完毕后,使用source .bashrc更新下,然后你就可以使用如下命令了:
rm: 删除文件到回收站
rl: 查看回收站内容
ur: 恢复文件到当前目录
三、自定义回收站功能
!/bin/bashmyrm(){D=/tmp/$(date +%Y%m%d%H%M%S); mkdir -p $D; mv "$@" $D && echo "moved to $D ok";
}
alias rm='myrm'
这样子当执行删除命令时,会将文件放到/tmp下的一个目录里面,而不会直接删除;
四、自定义加强版本的rm
#!/bin/bash# VARIABLES
VERSION="0.3"
TO_DELETE=()
RECURSIVE=false
FOREVER=false
VERBOSE=false# FUNCTIONS
function show_help()
{echo -e ""echo -e "This is custom script used to avoid deleting files forever"echo -e "instead files will be moved to $HOME/.Trash folder"echo -e "and this script only works if you invoked it directly from the terminal"echo -e "it doesn't work if for example git used rm or if you used rm in other scripts"echo -e ""echo -e "usage: rm [OPTION]...FILE..."echo -e "Move FILE(s) to $HOME/.Trash folder"echo -e ""echo -e "Options:"echo -e " -h, --help \t\tdisplay this help text and exit."echo -e " --version \t\toutput version information and exit."echo -e " -r, -R, --recursive,\tmove the directories and their content to the Trash folder."echo -e " -f, --forever,\tremove the directories and their content to the Trash folder."echo -e " \tuse this to delete files or empty trash it calls the /bin/rm"echo -e ""echo -e ""echo -e "Script source 'https://github.com/artmees/rm'"echo -e "github page 'https://artmees.github.io/rm'"echo -e ""echo -e "Install :"echo -e " sudo cp rm.sh /usr/local/bin/rm"echo -e "Uninstall :"echo -e " sudo rm /usr/local/bin/rm"echo -e ""echo -e "you need to restart the termial for this to work"echo -e "or you can use source ~/.bashrc or source ~/.bash_profile"echo -e ""echo -e "Use Old rm :"echo -e " /bin/rm"exit 0
}function check_flags()
{# check the flags user usedif [ $# -le 0 ];thenshow_helpfiwhile test $# -gt 0; docase "$1" in-h|--help) show_help;;-r|-R|--recursive)shiftRECURSIVE=true;;-f|--forever)shiftFOREVER=true;;--version)echo -e "$VERSION"exit 0;;-v|--verbose)shiftVERBOSE=true;;-a|-b|-c|-d|-e|-g|-h|-i|-j|-k|-l|-m|-n|-o|-p|-q|-s|-t|-u|-w|-x|-y|-z|-A|-B|-C|-D|-E|-F|-G|-H|-I|-J|-K|-L|-M|-N|-O|-P|-Q|-S|-T|-U|-V|-W|-X|-Y|-Z)echo -e ""echo -e "Invalid Argument"show_help;;*)get_to_delete $1shift;;esacdone
}# Helper method to populate the TO_DELETE array
function get_to_delete()
{while test $# -gt 0; doTO_DELETE=("${TO_DELETE[@]}" $1)shiftdone
}function check_trash_directory()
{# check that global system trash exists# if not create itif [ ! -d ~/.Trash/ ];thenmkdir ~/.Trashfi# check the files and flags passedcheck_flags $@if $FOREVER ;then# use the common system rm -r passing the same argumentsif $VERBOSE ;thenecho -e "`/bin/rm -r -v ${TO_DELETE[@]}`"else/bin/rm -r ${TO_DELETE[@]}fielsemove_to_trashfiexit 0
}# Move the deleted files to the trash
# show output if -V option was specified
function move_to_trash()
{for i in "${TO_DELETE[@]}";doFILENAME=$iFILENAME+="_"FILENAME+=$(date +"%H_%M_%S")if [ -d $i ] && $RECURSIVE ;thenif $VERBOSE ;thenecho -e "`mv -v $i ~/.Trash/$FILENAME`"elsemv $i ~/.Trash/$FILENAMEfielif [ -d $i ] ;thenecho -e "$i is a directory please use --recursive to remove directories and their content"elif [ -f $i ] ;thenif $VERBOSE ;thenecho -e "`mv -v $i ~/.Trash/$FILENAME`"elsemv $i ~/.Trash/$FILENAMEfielse# TODO add other option similar to rm -f to not output this errorecho -e "No such file or directory '$i'"fidone
}# Refer to http://stackoverflow.com/questions/20572934/get-the-name-of-the-caller-script-in-bash-script
# to understand the next funtion
# usage: determine if the script was invoked by a user or other script
# if it was invoked by other scripts then use the system rm instead
# to avoid messing with other scripts behaviour.
function check_invoker()
{PARENT_COMMAND=$(ps $PPID | tail -n 1 | awk "{print \$5}")if [ $PARENT_COMMAND == '-bash' ]; thencheck_trash_directory $@else/bin/rm $@exit 0fi
}# Main
check_invoker $@
exit 0
root权限下:
cp rm.sh /usr/bin
chmod u+x /usr/bin/rm.sh
chmod 777 /usr/bin/rm.sh
在$HOME/.bashrc中加入下面一句
alias rm=/usr/bin/rm.sh
效果如下:
rm rm.sh
(python2.7) appleyuchi@ubuntu:~/.Trash$ ls
rm.sh_16_13_38
进过以上的步骤就可以建立一个加强版本的rm命令,而不用担心可怕的rm 命令;
五、定期数据备份
定期做好数据备份,关键时刻好的习惯比起后期的补救措施,苦逼的想着数据恢复要好的多!
定期数据备份脚本:
#!/bin/sh
mkdir /home/beifen
#创建一个临时文件(要保存备份的路径)
cp -r /home/backups/balalala /home/beifen
#数据存在backups目录下,备份到beifen目录下,所以先将数据拷过来
tar -zcPvf /home/backup$(date +%Y%m%d).tar.gz /home/beifen#将数据所在文件夹beifen打包
rm -rf /home/beifen/#删除临时文件内容
find ./ -mtime +30 -name "*.tar.gz" -exec rm -rf {} \;
#删除改文件夹下超过30天的文件
1. 创建如上back.sh脚本
2.设置定时执行本脚本
crontab –e
0 23 0 * /home/backup.sh #每晚23:00执行一次
在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
crontab文件的一些例子:
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启apache。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启apache。
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启apache
Linux下防止rm -frv 删除错误的解决办法相关推荐
- linux下U盘无法删除文件的解决办法
Ubuntu下U盘出现文件系统只读的问题了.症状为无法删除U盘中现有文件,无法向U盘拷贝新的文件.但不知道是什么原因.今天下决心解决这个问题. 解决方法: 1. 在Ubuntu终端运行如下命令 tai ...
- Linux下通过rm -f删除大量文件时提示-bash: /bin/rm: Argument list too long的解决方法...
Linux下通过rm -f删除/var/spool/postfix/maildrop/中大量的小文件时提示: "-bash: /bin/rm: Argument list too long& ...
- linux调用一个函数失败 打印错误,linux下settimeofday函数调用失败,何故?解决办法...
当前位置:我的异常网» C语言 » linux下settimeofday函数调用失败,何故?解决办法 linux下settimeofday函数调用失败,何故?解决办法 www.myexceptions ...
- Linux 下 Shell 命令 IFS 分隔符 -- 应用场景 解决办法
Linux 下 Shell 命令 IFS 分隔符 – 应用场景 && 解决办法 文章目录 Linux 下 Shell 命令 IFS 分隔符 -- 应用场景 && 解决办 ...
- Windows 7 下安装VB6.0出现错误的解决办法
由于工作需要,经常用VB6编个小软件.在windows 7下安装企业版时,遇到几次无法安装或者安装出错的情况,记录下来,供自己和大家参考. 1,卡死在"安装程序正在搜索已安装的组件" ...
- Linux下通过 rm -f 删除大量文件时报错:Argument list too long
Linux删除nagios的大量性能文件时报错 -bash: /bin/rm: Argument list too long 如下图所示: 问题原因 如?待删除文件中包含的小文件数量过多,通常是由于受 ...
- linux下Qt cannot find -lGL错误的解决方法
在linux下使用Qt 编译时候遇上了cannot find -lGL错误 因为缺少相关包,可以使用下列命令安装 sudo apt-get install libqt4-dev
- python安装beautifulsoup失败_Win10环境下python36安装BeautifulSoup出现错误的解决办法
说明:win10 64位系统,Python3.6.3 Win10环境下安装BeautifulSoup4貌似没有任何问题,但是当使用时就会报错,错误如下: 通过报错信息到相应的位置去查看文件 try: ...
- linux下安装数据库提示/tmp空间不足解决办法
出现问题情况:安装数据库时,会使用到临时目录/tmp,但是/tmp太小时会报错,如下图所示 解决办法:需要重新分配/tmp目录大小 在root用户下执行 1.vim /etc/fstab 加入一行 t ...
- linux下mysql的忘记root密码的解决办法
因为放寒假家里没有宽带,便很少上网,前几天用手机进入自己的个人博客时竟然返回数据库不能连接的错误,吓我一跳,网站肯定被人黑了,但转头一想我的博客就几篇破文章,谁这么无聊要黑,我并没有立刻去网上找解决的 ...
最新文章
- 理论经典:TCP协议的3次握手与4次挥手过程详解
- java递归深度克隆_递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝。...
- apache.camel_Apache Camel 3.1 –即将推出更多骆驼核心优化
- leetcode 1442. 形成两个异或相等数组的三元组数目(位运算)
- ironpython3桌面开发_IronPython项目有了新负责人
- struct 和typedef struct的区别
- 二分图的匹配(未完)
- 如何检测VC运行库是否安装
- 【计算机组成与设计】3.4计算机CPU除法运算
- 思科ASA防火墙端口映射
- C语言显示图书信息的讲解,C语言图书信息管理系统解析.pdf
- linux中创建deamon进程的三种方法
- 安装VMtools:请确保您已登录客户机操作系统。在客户机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools。
- webpack安装使用教程
- 萧十一郎(程序员版)卷一 风四娘和割鹿刀
- poj2965The Pilots Brothers' refrigerator
- [AHOI2001]彩票摇奖
- 爱博精电助力厦门天马微电子实现厂区宿舍水电智能化管控
- Linux下文件内容更新了,文件夹时间戳却没变?
- es sql实现分页