避免rm -rf 引发惨案

在Linux中,rm是一个高效的工具,但是有时能带来灾难性的后果。敲一个rm -rf *就可能让今天的工作白做了,及时发现问题的话用debugfs也许能挽回损失,但是万一,万一磁盘数据被覆盖了呢?

接下来,做点事儿改变一下rm的行为。

1. 创建myrm脚本

因为exit会使得子shell退出,如果将此脚本写成一个函数放到.bashrc的话,中间一旦出错就会导致终端窗口关闭。故单独写一个脚本。

TRASH=~/trash

set -e #Exit immediately if any untested command fails in non-interactive mode.

if [[ $1 =~ ^-[^rf] ]]; then

echo "usage: rm [-rf] files"

exit 1

fi

if [ $# == 0 ]; then

echo "usage: rm [-rf] files"

exit 2

fi

mkdir -p $TRASH

echo rm $@

if [[ $1 =~ ^-[rf]|^-rf$ ]]; then

for (( i=2;i<=$#;i++ )); do

eval file="\${$i}"

echo "$file => ~/trash"

mv "$file" $TRASH

done

else

for (( i=1;i<=$#;i++ )); do

eval file="\${$i}"

echo "$file => ~/trash"

mv "$file" $TRASH

done

fi

上面的脚本主要针对rm *, rm -rf *, rm -f *, rm -r等危险的行为。

$file 之所以用"" 包围,是考虑到文件名含有空格的情况。

2. 将脚本放到/usr/bin/ 下

一般$PATH包含着/usr/bin/,如果没有的话可以修改/etc/profile文件,在文件末尾添加类似PATH=$value:$PATH的语句。之后,给脚本加上可执行权限,移动到/usr/bin/ 下,敲myrm,系统就能找到了。

3. 修改文件~/.bashrc

给文件~/.bashrc增添如下代码

alias rm=myrm

myclear(){

ls ~/trash

if [ $? -eq 0 ]; then

read -p "Do you want to clear all files in ~/trash (yes/no): " var

if [ $var = "yes" ]; then

\rm -rf ~/trash/*

elif [ $var = "no" ]; then

echo "nothing to do"

fi

fi

}

在这之后,可放心使用rm,并可用myclear定期清空自己的~/trash回收站。


注:这种方法仅在终端中敲命令有效,对于自己编写的脚本,rm还是原来的rm。

原文发布于微信公众号 - nginx(nginx-study)

原文发表时间:2018-04-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大闲人柴毛毛

Linux文件权限与目录管理

Linux文件系统的三种身份 文件所有者 同组用户 同一个用户组的用户可以访问该用户组的文件; 每个账号可以加入多个用户组。 在同一个用户组的...

4338
来自专栏web编程技术分享

用eclispe开发web项目初步

3569
来自专栏风中追风

分布式基础__HTTP 通信协议

https://www.zhihu.com/question/44323871/answer/347628315 这个地址是知乎上的一个问题,

38315
来自专栏黑泽君的专栏

使用CentOS 7.5卸载自带jdk安装自己的JDK1.8

  删完之后可以再通过:rpm -qa | grep java 或 rpm -qa | grep jdk 命令来查询出是否删除掉

3223
来自专栏抠抠空间

Linux用户权限

1800
来自专栏郭少华

Spring boot热部署(三)

CTRL + SHIFT + A --> 查找make project automatically --> 选中

1.3K1
来自专栏Golang语言社区

Go包管理的探索与实践

引言:刚学Go没多久,但是很快我就发现了Go的一个特别坑爹的地方 —— 包管理。当然不只是GFW的问题,更多的是有的时候,每个项目使用的包的版本并不是完全一致的...

41710
来自专栏小狼的世界

Linux中的Diff和Patch

本文主要记录两个命令的学习情况:diff 和 patch。diff 和 patch 是一对工具,使用这对工具可以获取更新文件与历史文件的差异,并将更新应用到历史...

1703
来自专栏程序员互动联盟

【专业技术】Linux设备驱动第七篇:高级字符驱动操作之阻塞IO

我们之前介绍过简单的read,write操作,那么会有一个问题:当驱动无法立即响应请求该怎么办?比如一个进程调用read读取数据,当没有数据可读时该怎么办,是立...

3237
来自专栏菩提树下的杨过

nginx学习(2):启动gzip、虚拟主机、请求转发、负载均衡

一、启用gzip 1 gzip on; 2 gzip_min_length 1k; 3 gzip_buffers 4 16k; 4 ...

2697

扫码关注云+社区

领取腾讯云代金券