it-swarm.cn

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

我在一个批处理脚本中重命名了几个文件。有没有一种方法可以撤消更改而不必重命名?

Linux是否提供undoing的本地方式?

55
Lazer

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

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

防止此类事故的最佳方法是使用版本控制系统(cvs,Bazaar,darcs,git,Mercurial,Subversion等)。它花费了一些时间来学习,但从中期和长期来看,它的回报是巨大的。

56

抱歉不行。

17
postfuturist

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

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

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

10
xenoterracide

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

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

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

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

8
vdboor

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

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

4
djsumdog

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

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

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

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

2
Deano

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

2
Stephen Jazdzewski

GitFS是基于Fuse的文件系统,它会自动计算版本之间的diffs,并允许在它们之间进行还原/浏览。

网页: https://www.presslabs.com/gitfs

文件: https://www.presslabs.com/gitfs/docs/usage/

1
test30