上次由于公司里机器要面临重装,开始仓皇地将Mac本里的文件scp到我的台式机上。忙乱之中本来要删除一个无用的文件夹的,结果用rm -rf的时候tab了一下,补全出来的文件都没看清就按下了回车,毫无疑问,文件删错了。由于rm命令是不走回收站的,连删前确认都不会有,所以就这么把一个有用的文件夹删掉了。幸亏后来发现我曾在台式机上备份过这个文件,否则美好的回忆就因为这个操作失误而丢失了。

为了防止此类事件的再度发生,我曾在Twitter上询问过别人关于实现rm时只把文件送到回收站而不删除的命令。有些人说用mv命令就行了,但是这显然是不够的,因为mv和rm命令选项并不兼容,尤其是本人惯用的rm -rf,mv显然做不到。其次把文件mv进回收站以后是不能put back的,那就更不行了。网上还有些方法提供了能够将文件送入回收站,并且能够put back的方法,这个还是不错,但是就如我之前所说,并未完全实现rm的选项功能。因此我就花了几个晚上的实现自己实现了一个符合我这一需求的工具:https://gitcafe.com/bachue/rm-trash

  • 这个工具是完全用Ruby编写的(一直以来都对纯Ruby情有独钟),考虑到Mac OS X自带Ruby 1.8.7,因此所有代码也在1.8.7上编写,并且保证在运行时绝对不依赖任何Gem(之所以不希望依赖Gem是因为以前在Linux上用Python写的实用工具的时候出错说包缺失,然后我从github的issues找出了错误的原因是没有安装依赖包,我显然不会搞Python,于是只能现场Google学习安装pip,再用pip把包装进去,搞得远比使用用C写的程序复杂的多,不能因为自己是这个语言的开发人员就认为其他人也有它的开发环境啊)。
  • 放进回收站的核心功能由AppleScript实现(所以只能跑在Mac OS X上),这里参考了这个Python的实现方法
  • 为了尽可能看起来比较炫比较有趣,所有输出信息全部(除了帮助信息外)彩色化。
  • 尽可能严格要求所有行为均与系统自带的rm命令一致,凡是不一致的都被当做Bug看待,除了一些不可能实现或是没必要实现的功能外(比如三次擦写文件块使得文件不可恢复以及试图恢复文件)。

其实起初我以为这个工具并不难做,只是把文件夹往回收站一放即可,后来做到交互式删除的时候难度倍增,使得我不得不多次大规模重构了代码以符合这种需求。幸亏项目之初就建立了完善的RSpec测试用例,否则肯定无暇顾及如此多的边缘Case。同时随着更深入的开发和研究,发现了越来越多刚开始没有发现的rm的行为细节,这些细节事实上至今为止我都没有完全模仿出来,因为程序目前的算法不允许这么做,不过由于程序已经基本可用而时间宝贵,只能等到以后有空的时间再实现罢。

(转)Mac OS X写了个rm时将文件放入回收站的小工具的更多相关文章

  1. 如何禁止 Mac OS X 在外接设备上生成 .DS_Store 文件?以及如何批量删除 .DS_Store 文件?

    如何禁止 Mac OS X 在外接设备上生成 .DS_Store 文件?以及如何批量删除 .DS_Store 文件?原文链接:http://www.java2class.net/bbs/viewthr ...

  2. 如何将Linux rm命令删除的文件放入垃圾箱

    因为rm命令删除的文件是不会放入垃圾箱的,所以无法恢复,下面小编就给大家介绍一种方法,通过替换Linux rm命令的方法,从而将rm命令删除的文件放入垃圾箱. 方法: 1. 在/home/userna ...

  3. 开始使用Mac OS X——写给Mac新人

    本文转自博客园:http://www.cnblogs.com/chijianqiang/archive/2011/08/03/2126593.html 写这篇文档的原因有两个,一.身边使用Mac的朋友 ...

  4. 【转】开始使用Mac OS X——写给Mac新人

    写这篇文档的原因有两个,一.身边使用Mac的朋友越来越多,经常会有人来咨询一些常见的使用问题,比如:“为什么把界面右上角的红色按钮叉掉,程序还没有关闭?”之类.而且我也不愿意看到很多人使用OSX时仅仅 ...

  5. Linux下将使用rm删除的文件显示在回收站中

    人难免会失误,出现一些问题,在删除文件的时候使用rm,删除之后就后悔了.因为rm命令删除的文件是不进入回收站的,这使得恢复起来很困难.解决这一难题,可以使用python编写的trash-cli( ht ...

  6. 【源码】rm zip 删除文件夹中大量的小文件 百万 扫描文件时间

    rm  删除文件夹中大量的小文件 百万 迟迟未删除 在扫描文件? rm删除命令源码分析 - ty_laurel的博客 - CSDN博客 https://blog.csdn.net/ty_laurel/ ...

  7. linux中使用rm命令将文件移到回收站的方法

    今天在终端下,看到我的用户目录下有个-的文件夹(maven生成),相要删除收回点空间,习惯性的用命令 rm -rf ~ ,一回车,猛然想起的时候已经来不及了,世界一下子清静了,想死的心都有了! 没错, ...

  8. mac os X中关于dayone缓存的实际文件位置

    最近刚安装了mac版的dayone软件,感觉蛮不错的!以前一直用iphone版的,mac版是要米的,68米丫!想了想还是一咬牙:买了! 我用的是iCloud同步,虽然资料放在云中,但本地还是会有缓存的 ...

  9. Mac OS X中打zip包时去除.DS_Store等指定文件

    在Finder中的Compress “…”很好用,但是也有烦恼的时候,经常打包会包含进来一些.DS_Store文件,.DS_Store是苹果系统中保存当前目录基本信息的文件,包括图标的位置,显示方式等 ...

随机推荐

  1. Tomcat内存溢出(java.lang.OutOfMemoryError: PermGen space)的解决办法

    Tomcat启动时报如下错误: java.lang.OutOfMemoryError: PermGen space 解决办法: 配置相关内存大小.其中按照启动tomcat的不同方式,分如下三种情况 a ...

  2. Java 常用数据结构深入分析(Vector、ArrayList、List、Map)

    线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ...

  3. windows条件下,Ping加上时间戳,并保存到文件,适用于测试网络

    在c盘下面新建文件 ping.vbs 在 ping.vbs中输入代码如下: Dim args, flag, unsuccOut args="" otherout="&qu ...

  4. 超级内存NVDIMM:下一代数据中心存储关键技术

    1.背景介绍 连接到互联网的设备数量不断增长,到2015年,将达到150亿之多.而数据中心的压力也随之增加,唯有采用新的技术才能进一步提升其效率和性能. 相比于HDD传统硬盘,固态硬盘大大增加了I/O ...

  5. QString::toWCharArray可以拷贝到宽字符串里

    wchar_t * sourcepath=new wchar_t[MAX_PATH];int s1=str.toWCharArray(sourcepath); sourcepath[s1]=0;

  6. [iOS问题归总]SourceTree+osChina版本管理出现的问题

    1.commit失败(1) 解决办法: 把爆红的路径的文件删除掉, 重新commit 2. push时候, 有100MB限制 解决办法: Git只允许上传最大100MB的文件,如果超过,则会被serv ...

  7. centos使用fuse挂载NTFS

    FUSE:用户空间文件系统(Filesystem in Userspace),是Linux 中用于挂载某些网络空间,如SSH,到本地文件系统的模块.如果装的是双系统,centOS并不支持ntfs分区, ...

  8. Android 实现Path2.0中绚丽的的旋转菜单

    上图先: 那么下面开始吧~ 首先,将整个菜单动画分解开来. 1.       一级菜单按钮的旋转动画2个,十字和叉叉状态的转换. 2.       二级菜单按钮的平移动画2个,弹簧效果的in和out ...

  9. wrong number of arguments,java方法反射时数组参数的坑

    java方法中只有一个参数是数组,反射的时候我们不能想当然的传歌数组进去,传数组进去的时候表示多个参数. 两个数组不是一个意思啊. 我们应该把数组转为objet,这样才表示一个参数. import j ...

  10. 利用Hessian如何实现Webservice

    利用Hessian如何实现Webservice [大] [中] [小] 发布人:圣才学习网  发布日期:2012-08-18 14:02  共966人浏览 Hessian是 一个轻量级的remotin ...