linux回收站设计

在windows下有一个很好的东西,那就是回收站,虽然有很多人批评它。linux不是没有回收站,很多桌面环境都可以看到是有回收站的。
这里是讨论如何设计一个回收站,而不是有没有的问题。最好的结果是将rm命令使用mv命令替代使用了。

1、设计思路

因为在linux下rm命令执行成功就直接将文件删除了,而不是将其移入回收站了,也没用给一个用于确认的命令提示,所以rm的误操作是很危险的。而使用mv命令来提供一个后悔机制,就挺好了。
我们可以设计这么一种操作,将rm命令用mv命令来改写,将要删除的文件,移动到一个隐藏的目录中。windows上的回收站就是这么做的,这是通常的做法。但是这还有一些问题,如下几点

1.文件同名问题。在一个目录下,不允许出现同名文件或者文件夹的问题。
2.恢复删除文件问题。如果只是简单的将要删除的文件移动到隐藏目录,那么就丢失了它原本所处的位置(路径)信息,不利于恢复到原目录。
3.不同分区问题。linux不同于windows,linux的目录结构并不体现出磁盘分区,所以单纯的根据文件路径不能确定其所在的分区。而如果不针对每个分区分设回收站,那么效率是很低的,因为不同分区间的文件移动,是会有拷贝过程的,而不仅仅只是目录项的操作。

2、设计思路问题分析

1、文件同名问题

文件同名的问题可以采取给文件编号的方式来解决。可以按照删除的顺序,给文件名加上一个数字前缀,这个数字从0开始,一直向上增加,就不会出现重复问题。对于这个数字,可以采取非十进制的设计来使得文件名更短小。比如说采取64进制的方式,以[0-9A-Za-z-_]这64个可见的可用于作为文件名的字符来作为前缀的"字符集",如果是64进制的话,那么需要的前缀长度可以选择固定长度,且不会很长。因为64=2^6,而2^32次方就已经大到42亿了,所以这里采用7或者8位就差不多足够了。对于整个文件夹删除的,仅仅对文件夹名加前缀就可以了。为了提高效率,还可以采取在前缀编号出现了空洞的时候(先删除了100个文件,又恢复了中间的20个,就出现了20个空洞的编号),采取不填补的原则,直接往后递增。当编号递增到最大值的时候,可以采取类似于磁盘整理的方式来进行前缀整理。

这里举一个例子,假设这里采取7位固定前缀。

删除的文件(夹)名 移动到回收站后的文件名
a.txt 0000000a.txt
b.jpg 0000001b.jpg
...删除了多个文件后 ...
tree.c 000001btree.c
dir 0000001cdir

这样做后,恢复文件的时候,只要去掉其前缀就可以了。采用固定长度前缀是为了提高效率,这里有一个问题没有解决,就是文件名长度的问题。因为绝大多数的文件名长度都远远低于限制大小,所有这个问题影响不大。


2、恢复删除文件问题

这个问题也很好解决,配合上一个问题的思路来做。因为前面说了给每一个删除的文件都加上了固定不重复的前缀,而文件名不可能为空,所以我们可以采取添加一个文件来纪录原文件所在路径的方式来解决这个问题。
举个栗子:有一个文件在目录/home/xxx/code/c/test/下,文件名是a.c。删除到回收站后,编号为000000km。那么这个文件删除到回收站后,将其文件名改为000000kma.c,那么再建立一个文件000000km这个文件的内容就是/home/xxx/code/c/test。这么做就保存了文件所在的原本路径,恢复的时候根据这个路径来恢复就是了。
---

3、不同分区问题

这个问题要解决也不难,就是针对各个分区设立回收站嘛。主要问题在于获取文件或者文件夹所在的分区。这个不难,可以通过df -h来获取各个分区的挂载点,然后对文件或目录的路径来比对得出其所在的分区即可。这里的一个问题是要不要为了提高效率而存储各个分区挂载路径的结果呢?我觉得是不需要的,使用df -h命令的成本并不高,而且不会涉及到分区卸载后再挂载到另外目录的情况。

linux回收站设计的更多相关文章

  1. 《linux内核设计与实现》实践之模块及深入

     <linux内核设计与实现>实践之模块及深入 写在前面的话. 基础模块部分我已经做完了,设计到的知识点无非就是,编写模块代码,编写Makefile文件,加载模块和卸载模块部分.由于大家都 ...

  2. 《Linux内核设计与实现》CHAPTER13阅读梳理

    <Linux内核设计与实现>第13章阅读总结 [edited by 5216lwr] 一.虚拟文件系统概述 1.虚拟文件系统 (也称作虚拟文件交换或VF)作为内核子系统,为用户空间程序提供 ...

  3. 《Linux内核设计与实现》CHAPTER17阅读梳理

    <Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...

  4. 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...

  5. 《Linux内核设计与实现》课本第三章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第三章自学笔记 进程管理 By20135203齐岳 进程 进程:处于执行期的程序.包括代码段和打开的文件.挂起的信号.内核内部数据.处理器状态一个或多个具有 ...

  6. 《Linux内核设计与实现》课本第十八章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第十八章自学笔记 By20135203齐岳 通过打印来调试 printk()是内核提供的格式化打印函数,除了和C库提供的printf()函数功能相同外还有一 ...

  7. 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳

    <Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...

  8. Linux内核模块设计

    内核的设计有两种方式:单内核和微内核,两者各有优劣,关于两者的比较可以参见wiki.windowds和Solaris采用微内核结构. Linux内核采用单内核结构,设计比较简单,但单内核的理念是把所有 ...

  9. 《Linux内核设计与实现》读书笔记 - 目录 (完结)

    读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!!!). 为了方便以后查看, 做个<Linux内核设计与实现>读书笔记 的目录: < ...

随机推荐

  1. ubuntu下Eclipse安装

    安装的版本是MARS 直接复制安装包到安装的目录,然后tar zxvf XXXX 对于不能输入中文,把系统的输入法改成ibus就行了,fctix不支持eclipse 汉化包的下载地址 http://d ...

  2. zencart分类页产品页去掉url中的id号

    最近公司新上的网站被seo指出要修改url,去掉url中产品id.由于我们用的是zencart框架,装了 Ultimate SEO URLs 插件,所以在网上应该有这方面的资料,本文主要参考资料: 原 ...

  3. Orchard源码分析(1):Orchard架构

      本文主要参考官方文档"How Orchard works"以及Orchardch上的翻译.   源码分析应该做到庖丁解牛,而不是以管窥豹或瞎子摸象.所以先对Orchard架构有 ...

  4. Jetty多Connector

    有时候想要启动两个端口,或者通过一个Jetty server提供多个不同服务,比如说使用8080来指定默认访问端口,使用8433指定https访问端口等等,此时就可以通过创建多个Connector来解 ...

  5. [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键

    我们先了解下InnoDB引擎表的一些关键特征: InnoDB引擎表是基于B+树的索引组织表(IOT): 每个表都需要有一个聚集索引(clustered index): 所有的行记录都存储在B+树的叶子 ...

  6. asp.net mvc中在使用async的时候HttpContext为null的问题

    摘要 HttpContext上下文并不是无处不在的.详情可以看下Fish Li的文章,解释的比较清楚. HttpContext.Current并非无处不在 问题复现 public async Task ...

  7. mapreduce 自定义数据类型的简单的应用

    本文以手机流量统计为例: 日志中包含下面字段 现在需要统计手机的上行数据包,下行数据包,上行总流量,下行总流量. 分析:可以以手机号为key 以上4个字段为value传传递数据. 这样则需要自己定义一 ...

  8. vim 中 也可以 直接安装 emmet 直接使用zen coding 生成 l指定个数的 lorem ipsum文字.

    超链接的写法: 当作为链接的文字, 比较长时, 整个作为链接 就显得不是 很适合. 可以取其中的某一个单词 作为 超链接的 关键字:如: click here to continue emmet中如何 ...

  9. High Frequency Trading (整理中...)

    什么是高频交易系统 1 交易指令完全是由电脑发送,对市场数据的响应延时在微秒级2 系统有专用的软硬件组成,研发时需要大量的计算机专家级的工作3 系统的硬件需要放在离交易所主机很近的位置,所谓co-lo ...

  10. PostgreSQL建立分区表示例

    pgsql 分区表: --主表 create table test(id integer, name varchar(32)); create index idx_test_id on test us ...