众所周知,脑残可以学习,但是手残没法治。相信每一位喜欢用终端操作电脑的同学都曾手误使用 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. Event Loop事件循环,GET!

    JS中比较让人头疼的问题之一要算异步事件了,比如我们经常要等后台返回数据后进行dom操作,又比如我们要设置一个定时器完成特定的要求.在这些同步与异步事件里,异步事件肯定是在同步事件之后的,但是异步事件 ...

  2. JavaScript中点击按钮弹出新的浏览器窗口

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.js * 作者:常轩 * 微信公众号:Worldhel ...

  3. 量化投资学习笔记31——《Python机器学习应用》课程笔记05

    用分类算法进行上证指数涨跌预测. 根据今天以前的150个交易日的数据,预测今日股市涨跌. 交叉验证的思想:将数据集D划分为k个大小相似的互斥子集,每个子集都尽可能保持数据分布的一致性,即从D中通过分层 ...

  4. tomcat&servlet初记

    tomcat&servlet初记 1. web相关概念 2. web服务器软件的学习:tomcat 3. servlet入门学习 web相关概念 1,软件架构 1,cs架构:客户端/服务器端 ...

  5. LLVM 中间代码归纳

    Identifiers 标识符 @ 全局 % 局部 后接字符串 命名量 @name %name 无符号数字 未命名量 @42 %42 类型系统 void 空类型 <type> * 指针类型 ...

  6. 从头认识js-基本概念(关键字,保留字,数据类型)

    语法 ECMAScript的语法大量借鉴了C及其他类C语言(如Java和Perl)的语法.因此,熟悉这些语言的开发人员在接受ECMSAScript更加宽松的语法时,一定会有一种轻松自在的感觉. 区分大 ...

  7. MVC08

    1. c# 索引器(indexer) using System; using System.IO; namespace IO { class Program { ]; static void Main ...

  8. 服务器推送 SSE 了解一下?

    hello~亲爱的看官老爷们大家好~过完年第一周已经结束,是时候开始制定新的工作计划了.主要负责的项目是数据可视化平台,而使用中如果服务器能有推送能力让页端得到相关通知的话,就能实现很多功能上的优化. ...

  9. 前端面试题-HTML语义化标签

    一.HTML5语义化标签 标签 描述 <article> 页面独立的内容区域. <aside> 页面的侧边栏内容. <bdi> 允许您设置一段文本,使其脱离其父元素 ...

  10. HTML5前期学习准备(一)

    HTML简介 1.html的基本概念 HTML:HyperTextMarket language,超文本标记语言(所谓"超文本"就是指页面内可以包含图片.链接,甚至音乐.程序等非文 ...