众所周知,脑残可以学习,但是手残没法治。相信每一位喜欢用终端操作电脑的同学都曾手误使用 rm 命令把不该删除的文件删了。然而,使用 rm 删除的文件是不会进去回收站的。

所以,最好的方法就是我们自定义一个命令 del ,以后通过自定义的 del 删除文件。当然,很难做到完全替代 rm,但是对于日常使用是足够的。

下面是准备实现的功能:

  • del file1 file2 ...: 把每一个文件移入回收站。
  • del dir:因为对目录操作的风险较大,因此这里只给出提示信息,让用户自行使用 rm 删除。

下面来看 Ubuntu 下的回收站的结构。回收站的路径是 ~/.local/shared/Trash/,其结构只有三个目录:

  • files:被删除的文件的位置。
  • info:记录被删除文件的操作信息,包括原路径和删除时间。
  • expunged:没查,不知道(>_<)。
sin@ubuntu:~$ cd .local/share/Trash/
sin@ubuntu:~/.local/share/Trash$ tree .
.
├── expunged
├── files
│   └── testdel
└── info
└── testdel.trashinfo 3 directories, 2 files
sin@ubuntu:~/.local/share/Trash$ cat info/*
[Trash Info]
Path=/home/sin/workspace/testdel
DeletionDate=2020-02-19T15:42:14

那么,实现上面的需求就很简单了:在 ~/.bashrc 中加入我们的命令函数,然后通过 alias 重命名为我们想要的名称就可以了。

# my alias, add by sinkinben at 2020/02/19
alias del='trash'
write_trashinfo()
{
info_path='/home/sin/.local/share/Trash/info/'
abs_path=$info_path$1'.trashinfo'
echo '[Trash Info]' > $abs_path
echo Path=$2/$1 >> $abs_path
echo DeletionDate=`date +"%Y-%m-%dT%H:%M:%S"` >> $abs_path
}
trash()
{
src_path=`pwd`
trash_path='/home/sin/.local/share/Trash/files/'
for x in $@
do
if [ -d $x ]
then
echo '[BE CAREFUL!] ' $x ' is a directory.'
echo 'You should use rm to finish this operation by yourself.'
continue
fi
if [ -f $x ]
then
mv $x $trash_path
write_trashinfo $x $src_path
fi
done
}

重启一下终端,输入 alias,可以找到新加入的 del 命令:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias del='trash'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
  • 测试 1:删除普通的文件

    sin@ubuntu:~/workspace$ touch f1 f2 f3
    sin@ubuntu:~/workspace$ ls
    f1 f2 f3 scripts Sin-Notebook sjtu-courses snake.py
    sin@ubuntu:~/workspace$ del f*
    sin@ubuntu:~/workspace$ tree ~/.local/share/Trash/
    /home/sin/.local/share/Trash/
    ├── expunged
    ├── files
    │   ├── f1
    │   ├── f2
    │   ├── f3
    │   └── testdel
    └── info
    ├── f1.trashinfo
    ├── f2.trashinfo
    ├── f3.trashinfo
    └── testdel.trashinfo 3 directories, 8 files
    sin@ubuntu:~/workspace$ cat ~/.local/share/Trash/info/*
    [Trash Info]
    Path=/home/sin/workspace/f1
    DeletionDate=2020-02-19T15:52:12
    [Trash Info]
    Path=/home/sin/workspace/f2
    DeletionDate=2020-02-19T15:52:12
    [Trash Info]
    Path=/home/sin/workspace/f3
    DeletionDate=2020-02-19T15:52:12
    [Trash Info]
    Path=/home/sin/workspace/testdel
    DeletionDate=2020-02-19T15:42:14
  • 测试2: 删除目录

    sin@ubuntu:~/workspace$ mkdir dir1
    sin@ubuntu:~/workspace$ del dir1/
    [BE CAREFUL!] dir1/ is a directory.
    You should use rm to finish this operation by yourself.

当然,这有一个缺点,对于被删除的同名文件,这个 del 命令就很捉急了。比如:

del dir1/test
del dir2/test

显然,在回收站中,dir1/test 这个文件就被 dir2/test 给覆盖了(包括文件内容和日志信息)。但是如果使用 Ubuntu 的文件管理器进行删除,回收站是能够处理这种同名情况的。

好了,又水了一篇文章,祝各位小改改身体健康。

给rm命令加保险的更多相关文章

  1. ubuntu 修该rm命令使删除文件到回收站

    ubuntu下删除文件到回收站 相信有不少同学和我一样,有因习惯了rm命令,好几次一不小心冲动就删除重要文件的惨痛经历! 目标:将删除成功的文件会放入系统回收站中,位置:~/.local/share/ ...

  2. 每天一个Linux命令(05)--rm命令

    自从学会了用mkdir创建目录之后,整个系统里就只能看到一堆空目录了,囧~ 那么今天我们来学一下如何清理这些空目录吧--rm命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录 ...

  3. 相对和绝对路径/cd命令/创建和删除目录mkdir/rmdir/rm命令

    2.6 相对和绝对路径 2.7 cd命令 2.8 创建和删除目录mkdir/rmdir 2.9 rm命令 绝对路径:从根开始的路径:文件所在的路径: 相对路径:相对于当前目录而言的路径:上一级或者下一 ...

  4. 下厨房6月26日数据丢失事故总结 MYSQL主分区被rm 命令误删除

    下厨房6月26日数据丢失事故总结 MYSQL主分区被rm 命令误删除 http://tech.xiachufang.com/?p=18 在6月26日凌晨12点左右,我们在做线上数据库的备库时,误将线上 ...

  5. linux 重写rm命令

    重写rm命令 replease rm to trash   必须使用root编辑/etc/bashrc vim /etc/bashrc 在最后面增加如下脚本 saferm () { if [ ! -d ...

  6. linux系列(五):rm命令

    rm是一个危险的命令,使用的时候要特别当心,尤其对于新手,否则整个系统就会毁在这个命令(比如在/(根目录)下执行rm * -rf).所以,我们在执行rm之前最好先确认一下在哪个目录,到底要删除什么东西 ...

  7. centos7 配置rm命令失效。

    之前写过一篇alias别名的方法,但这个方法配置rm命令在重启后就无效了.而且重启后得输入source alias_test.sh.才可以 centos7 alias别名永久生效 原因是:root用户 ...

  8. Linux命令学习总结:rm命令

    命令简介:   该命令用来删除Linux系统中的文件或目录.通常情况下rm不会删除目录,你必须通过指定参数-r或-R来删除目录.另外rm通常可以将该文件或目录恢复(注意,rm删除文件其实只是将指向数据 ...

  9. 【初级】linux rm 命令详解及使用方法实战

    rm:删除命令 前言: windows中的删除命令大家都不陌生,linux中的删除命令和windows中有一个共同特点,那就是危险,前两篇linux mkdir 命令详解及使用方法实战[初级]中我们就 ...

随机推荐

  1. IDEA 运行junit单元测试方法

    配置Run,增加Junit 最终配置如下:

  2. 致敬——C语言

    2016年4月26日21:00      OJ考试平台关闭,C语言这门课程也就随之结束了. 回顾学习历程,坦诚的讲学习期间也努力过也颓废过,但从来没有绝对的放弃过.由于种种客观原因与主观原因导致没有给 ...

  3. OpenCV读一张图片并显示

    Java 版本: JavaCV 用OpenCV读一张图片并显示.只需将程序运行时的截图回复.如何安装配置创建项目编写OpenCV代码,可参考何东健课件和源代码或其他资源. package com.gi ...

  4. 什么是Activiti

    什么是Activiti Activiti属于工作流引擎的一个开源实现.Activiti由Tom Bayen发起.在2010年5月发布了第一个版本.命名也很有意思的采取了Activities(活动)的化 ...

  5. 7-19 计算有n个字符串中最长的字符串长度 (40 分)

    编写程序,用于计算有n(1<n<10)个字符串中最长的字符串的长度.前导空格不要计算在内! 输入格式: 在第一行中输入n,接下的每行输入一个字符串 输出格式: 在一行中输出最长的字符串的长 ...

  6. VGG16等keras预训练权重文件的下载及本地存放

    VGG16等keras预训练权重文件的下载: https://github.com/fchollet/deep-learning-models/releases/ .h5文件本地存放目录: Linux ...

  7. 阿里云上docker部署nginx实现反向代理

    简介   需要从镜像仓库找到所需要的nginx版本pull下来.(地址:https://hub.docker.com/) 1.docker pull nginx 1.挂载目录 1.1 获取nginx. ...

  8. RabbitMQ 消息模式

    消息模式实例 视频教程:https://ke.qq.com/course/304104 编写代码前,最好先添加好用户并设置virtual hosts 一.简单模式 1.导入jar包 <depen ...

  9. IOS7下,alertView不能使用addSubview添加textField解决办法

    UIAlertView *alertView1 = [[UIAlertView alloc] initWithTitle:@"Enter Form Name" message:@& ...

  10. C#.Net全栈工程师之路-学习路径

    C#.Net全栈工程师之路-学习路径 按架构分: C/S架构: B/S架构: Mobile移动开发: 按技术点分: C#编程基础以及OOP面向对象编程: 数据库基础以及高级应用(MYSQL+MSSQL ...