在Linux中是否可以撤消操作?


Answers:


53

Linux(与其他unices一样)本身不提供撤消功能。其哲学是,如果它消失了,它就消失了。如果它很重要,则应该对其进行备份。

有一个保险丝文件系统,可以自动保留旧版本的副本:copyfs,在所有良好的发行版中都可用。当然,那会占用很多资源。

防止此类事故的最佳方法是使用版本控制系统(cvs,bazaar,darcs,git,mercurial,subversion等)。它需要一点时间来学习,但是从中期和长期来看,它的回报是巨大的。


1
gitfs是个不错的选择,它正在开发中
test30 '16

1
好吧,如果您意外删除或覆盖了尚未
暂存

14

抱歉不行。


19
我不知道我认为这很不幸……实施撤消操作需要大量资源。我什至不喜欢默认情况下启用的-i选项rm。我的Unix系统不应该帮助我。
xenoterracide

5
-i默认情况下启用?不是我的发行版,没有先生!
Stefan 2010年

9

没有,在任何Unix中都没有神奇的撤消。Unix假定您知道自己在做什么。对于撤消支持,请使用VCS(您的文本编辑器也可能内置了它)。

大多数文件系统没有透明地执行此操作的能力。

Mac和Windows上的Time Machine和系统还原分别只是备份/更改控制系统。


7

命令行中没有撤消操作。但是,您可以使用rm -i和运行命令mv -i。这将提示您“确定吗?” 在执行命令之前询问。

也可以为其添加别名到启动脚本(例如~/.bashrc/etc/bash.bashrc):

alias remove='rm -i'
alias move='mv -i'

编辑:通过以下建议,我删除了为默认命令添加别名的建议。相反,它现在引入了新命令)。


1
+1。只是在这里添加。在某些情况下,设置完别名后,如果您只想直接删除而不显示“您确定”提示,则可以使用\ rm和\ mv绕过别名。您还可以使用-f选项。
Hemant 2010年

2
mv -i仅在它将覆盖文件时提示(这使它有用且不令人讨厌)。同样,alias cp='cp -i'
吉尔(Gilles)'所以

8
混淆rm和mv是一个非常糟糕的主意。(rm更为糟糕。)永远不要养成使用rm来表示rm -i的习惯-您最终会在未定义别名的地方使用它,并永久删除某些内容。如果希望得到提示,请养成始终使用rm -i的习惯。
msakr 2010年

如果希望得到提示,请使用其他名称下的别名。我使用move ='mv -i',copy ='cp -i',symlink ='ln -si'并安装垃圾桶命令而不是rm。在编写脚本时,我仍然直接使用mv,cp和rm,但是对于交互式使用,这些别名很方便。

@mahmoudsakr您完全正确,我错过了这一点。我也没有这些命令的别名。将它们别名为另一个命令似乎是最明智的选择!
vdboor

4

Linux / Unix系统没有删除的原因是大多数文件系统存储其信息的方式。文件元信息全部存储在磁盘的前面,并引用了磁盘其余部分的索引节点。通常,大多数文件系统在此元区域中为文件分配10个块。前7个是指前7个inode。第8个和第9个转到inode列表(双向链接的块),第10个转到列表列表的列表(三重链接的块)。随文件系统(ext4,jfs,xfs等)的不同而不同,但是这些块列表通常可以处理从2GB到几TB的文件大小。

但是,由于所有这些信息都存储在磁盘的前端,因此,在删除文件时,无法引用磁盘上的索引节点所使用的元数据。相比之下,FAT32和NTFS实际上与文件本身一起存储一些头信息,从而使识别一组块所使用的文件更加容易(只要新文件尚未回收该空间)。在Linux工作中,删除某些内容时,几乎总是第一件事就是立即被新数据覆盖以提高效率。


2

如果您确实想要撤消功能,请使用源代码控制。 Subversion实际上在单用户计算机上运行良好。我用它来控制我的家庭系统上的所有个人文件。这似乎有点过头了,直到灾难发生,流氓脚本或命令行错字出现。


1
但这并不能保护您rm -r .。;)
Umang 2010年

1
@Umang实际上我使用git做了一次,我在那里保存了一个本地存储库,并且不小心rm -r project.git。幸运的是,如果您在远程服务器上保留不太可能发生的另一个版本
phunehehe 2010年

1
@phunehehe和+1了我的评论的人:我们太习惯了DVCS,以至于我发现自己完全错了。SVN提交到仓库(不是分支)。所以,你真正得到保护rm -r .。我真是愚蠢。
Umang 2010年

2

我想添加到.bashrc中的一件事是复制和删除功能。就像是:

cprm(){
    cp -p $1 ~/deleted/$1
    rm $1
}

但是您必须养成键入cprm而不是rm的习惯。

显然,如果磁盘空间有限,则需要保持在已删除区域的顶部。


4
您可以将其缩短为mv $ 1〜/ deleted / $ 1
Stefan 2010年

是的,如果引用正确,它将用另一个“新文档1”覆盖一个文件“新文档1” "$1"
用户未知

@userunknown:您是说在Deano和Stefan的代码中将$ 1引用为“ $ 1”吗?
蒂姆(Tim)

@Tim:是的,我愿意。
使用者不详

为什么不移动而不是cp和rm?
user1559897 '18

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.