较安全的rm脚本

March 29th, 2011 Categories: 应用

想必不少人体会过在Linux下误删文件的欲哭无泪的感觉。我整理出一份比较安全的rm脚本,贴在这里。

特性

  • 接管原生的/bin/rm命令,将待删除的文件mv至回收站,便于统一管理,或者更重要的,拯救误删文件。
  • 需要调用原生的rm时,指定路径即可,例如:/bin/rm -rf somefolder
  • 记录删除日志到/var/log/trash.log。如果不需要记录日志,只需要将log变量置空即可。
  • 将文件移动至回收站时自动重命名,以便可以重复删除重名文件。
  • 贴图:我爱正则表达式

贴代码

用法

  • 将下面的代码贴至~/.bashrc 或 ~/.bash_profile中,然后刷新该文件source ~/.bashrc即可。
  • 临时取消自定义的rm:可以使用前文所说的/bin/rm或在当前环境下取消该function的定义:unset -f rm
  • 需要根据自己的系统,修改一下各个变量的定义。
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #safe remove, mv the files to .Trash with unique name
    #and log the acction
    function rm()
    {
        trash="$HOME/.Trash"
        log="/var/log/trash.log"
        stamp=`date "+%Y-%m-%d %H:%M:%S"` #current time

        while [ -f "$1" ]; do

            #remove the possible ending /
            file=`echo $1 |sed 's#\/$##' `

            pure_filename=`echo $file  |awk -F / '{print $NF}' |sed -e "s#^\.##" `

            if [ `echo $pure_filename | grep "\." ` ]; then
                new_file=` echo $pure_filename |sed -e "s/\([^.]*$\)/$RANDOM.\1/" `
            else
                new_file="$pure_filename.$RANDOM"
            fi

            trash_file="$trash/$new_file"
            mv "$file" "$trash_file"

            if [ -w $log ]; then
                echo -e "[$stamp]\t$file\t=>\t[$trash_file]" |tee -a $log
            else
                echo -e "[$stamp]\t$file\t=>\t[$trash_file]"
            fi

            shift   #increment the loop
        done
    }
    Tags:

    32 Responses to “较安全的rm脚本”

    1. March 29th, 2011 at 13:20
      1

      用了很长一段时间的trash-cli了

      [Reply]

      rex Reply:

      不错的东东。看来没必要重新发明。

      [Reply]

      freetstar Reply:

      貌似还有一个比较简单。。http://www.fainz.info/linux-replace-rm-to-mv.html

      [Reply]

       rex Reply:

      楼上提到的脚本如下。本文脚本的思路一致,只不过加上了些自定义的设置等等,顺便练手bash。

      1
      2
      3
      4
      5
      6
      mkdir -p ~/.trash
      alias rm=trash
      trash()
      {
        mv $@ ~/.trash/
      }

      [Reply]

      freetstar Reply:

      博主文章里的代码高亮怎么弄的~求指导~

      [Reply]

      rex Reply:

      可以搜索一下 WP 插件CodeColorer 。它支持 段落风格的代码高亮,以及inline模式的高亮。

      [Reply]

    2. March 29th, 2011 at 21:21
      2

      thanks :) 以前还没听过这个插件~

      [Reply]

    3. qb
      April 1st, 2011 at 21:46
      3

      你好博主, 我有个正则表达式的问题想请教一下:

      我想表示除了制表符\t以外的所有空白字符\s。

      这个字符如何表示。

      多谢!

      [Reply]

      qb Reply:

      明白了,用[^\S\t]

      [Reply]

      rex Reply:

      你的解法有问题。等我回复。

      [Reply]

      qb Reply:

      难道要考虑\n 那就是 [^\S\t\n] ?

      主要应用是在处理excel文件时,有很多看不见的“空格”造成数据往数据库中导入出错。

      所以把excel表格中的数据复制到 emeditor中处理一下。[^\S\t]就可以一下处理完,而不是一列一列得处理。

      [Reply]

      rex Reply:

      除了制表符\t以外的所有空白字符\s

      这个在一般的正则引擎里,只能穷举一下吧。
      有的引擎(.NET)倒是支持字符组的+/-操作。

      [Reply]

      qb Reply:

      perl应该是支持的吧, 我用的文本编辑器是emeditor。 那天试了好像还可以, 就试不好穷举

      [Reply]

      rex Reply:

      (?!\t)\s
      此处是个空白字符,但是此处不是\t。这样试试。

      [Reply]

    4. pt
      April 2nd, 2011 at 09:10
      4

      use

      1
      while [ -e "$1" ]; do

      rm directory as well

      [Reply]

    5. hi
      April 23rd, 2011 at 13:00
      5

      楼主bash的字体是哪种?可以列出来吗?

      [Reply]

    6. abcd
      July 16th, 2011 at 00:58
      6

      博主能评价一下emacs和vim对正则支持得怎么样吗?

      [Reply]

      rex Reply:

      emacs 用得较少。

      [Reply]

      abcd Reply:

      那vim呢?是不是比一般的复杂一些,加转义加得比较多?支持到什么程度?

      [Reply]

      rex Reply:

      应该说,vim对于正则的支持还是相当全面的,只不过语法比较怪异。
      我整理了一份vim 正则特性,在google spreadsheet上,https://spreadsheets.google.com/pub?key=tYpX806OUUWG2uehT7XMH8A,翻墙可见。

      [Reply]

      abcd Reply:

      vim的零宽度反向匹配 atom\@<= 就是perl的(?<=atom),我怎么没试成功呢?请教一下应该怎么写。

      [Reply]

    7. brillywu
      August 17th, 2011 at 16:58
      7

      在sf.net下载了Expressor,这个工具也不错。可以帮助测试build正在表达式。不过在这些软件中,我有些功能不好实现。
      比如:
      ….xyz….
      ~~~====
      …..123….
      ===~~~~~
      …abc…..
      ~~~~=====
      ….345….

      类似这样的文字,其中字符和数字串是我要匹配的东西。我也能正确匹配出来。现在我想把这些找到的东西抽出来,集中起来,变成类似
      xyz
      123
      abc
      345
      这样的形式。如果使用语言来编写程序,我想肯定可以,但是使用工具软件,有这个功能吗?
      谢谢指点。

      [Reply]

    8. hplonline
      August 21st, 2011 at 14:10
      8

      不错~可以不用重复造轮子了。

      有几个地方:
      1. 中间一节获得purename的可以用basename代替
      2. 如果是多个device之间mv,会产生实际的数据搬移操作,不仅仅是修改文件表。这样效率不高。如果先识别mount point,对每个device分别放一个trash,会好不少。

      [Reply]

    9. wind
      December 23rd, 2011 at 21:54
      9

      请问下德文的正则字符 À-ÖØ-öø-ÿ 怎么转成能支持utf-8 中文呢?

      $q = trim(preg_replace(‘/([^-A-Za-zÀ-ÖØ-öø-ÿ0-9.@ ]*)/’, ”, $_REQUEST['q']));

      [Reply]

    10. 双鱼座和什么座最配
      February 1st, 2012 at 16:01
      10

      博主的内容好强大,不过经常更新的话,会更好的。

      [Reply]

    11. February 4th, 2012 at 17:12
      11

      立春万物更新,也希望博主的博客也经常更新。http://www.baiyangzuo.org/

      [Reply]

    12. February 5th, 2012 at 16:34
      12

      好文章,当然会拜读了,原博主博客人气旺旺。http://www.btdrzs.com.cn/

      [Reply]

    13. February 6th, 2012 at 15:43
      13

      虽然是元宵节,但是我们这好冷,风又好大,只能在家里看看博主的精彩博文了。http://www.shizizuo.info/

      [Reply]

    14. February 7th, 2012 at 11:11
      14

      认真阅读后飘过,不得是不说好内容。http://www.tianxiezuo.org/

      [Reply]

    3 trackbacks

    Leave a Comment

    如何在本站贴代码?

    可以使用任意语言名称代替“python”.