我们在 Linux 中有撤消功能吗?

Laz*_*zer 65 command-line

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

Linux 是否提供了一些原生的undoing 方式?

Gil*_*il' 61

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

有一个保险丝文件系统可以自动保留旧版本的副本:copyfs。当然,这会占用大量资源。不幸的是,它没有维护。Gitfs可能是另一种选择,我从未尝试过。

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

  • 不错的选择可能是 gitfs,它正在开发中 (2认同)

pos*_*ist 20

抱歉不行。

  • 我不知道我认为这很不幸……实现撤消需要相当多的资源。我什至不喜欢默认启用的 `rm` 上的 `-i` 选项。我的 Unix 系统不应该牵着我的手。 (19认同)
  • -i 默认启用?!不是我的发行版,不,先生! (6认同)

xen*_*ide 11

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

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

mac 和 windows 上的时间机器和系统还原分别只是备份/更改控制系统。


vdb*_*oor 9

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

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

alias remove='rm -i'
alias move='mv -i'
Run Code Online (Sandbox Code Playgroud)

编辑:根据下面的建议,我删除了给默认命令别名的建议。相反,它现在引入了新命令)。

  • 将 rm 和 mv 别名化是一个非常糟糕的主意。(rm 是最糟糕的。)永远不要养成使用 rm 表示 rm -i 的习惯——你最终会在没有定义别名的地方使用它,你会永远删除一些东西。如果您喜欢被提示,请养成始终使用 rm -i 的习惯。 (8认同)
  • `mv -i` 仅在覆盖文件时提示(这使它有用而不令人讨厌)。同样,`alias cp='cp -i'`。 (2认同)

djs*_*dog 6

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

但是因为所有这些信息都存储在磁盘的前面,所以当一个文件被擦除时,无法将磁盘上的 inode 引用到它们使用的元数据所属的位置。相比之下,FAT32 和 NTFS 实际上将一些头信息与文件本身一起存储,从而更容易识别一组块使用属于哪个文件(只要该空间尚未被新文件回收)。在 Linux 工作中,当你删除一些东西时,为了效率,它几乎总是首先被新数据立即覆盖。