我有时通过 ssh 使用我的服务器。我不想因为意外而丢失任何东西rm
。有没有办法为我的服务器创建一个垃圾箱?我知道这听起来很蠢,但我只是想知道如果我不小心删除了文件,是否有办法恢复。
我考虑过为 添加一个新的别名rm
,但这并不总是有效。我有时会使用 Sublime 的 SFTP 包,我也可能会不小心用它删除东西。
我能做些什么?
提前非常感谢您。
答案1
如果添加别名,则~./bashrc
可以防止删除文件。您可以使用 Timothy Duane 的回答为命令添加别名
alias rm='trash-put'
选择:
alias rm='mv --verbose -f --backup=numbered --target-directory ~/.Trash/'
将把 mv 文件移到本地垃圾箱,如果已经存在同名文件,还会创建备份。
如果您想要全局别名:将其添加到/etc/bashrc
。
答案2
首先,你不想改变rm
全局的行为。这只会破坏你的系统1。许多程序都是rm
内部调用的,因此如果你改变其行为方式,它们将无法工作,这可能会产生意想不到的后果。你必须限制自己保护你自己从rm
。
但是,您可以为 添加一个别名rm
,从而改变其行为~/.bashrc
。对于ssh
会话,您可以通常情况下需要将其添加到您的.profile
,但默认的 Ubuntu.profile
调用.bashrc
,所以除非您自己更改它,否则没有必要。基本上,如果您不知道我在说什么,只需使用。FTP会话中的~/.bashrc
命令delete
完全不同,不会受到影响。
因此,您可以使用以下几个别名:
rm -i
和rm -I
如 中所述
man rm
,这两个标志可防止您无意中删除文件。您可以根据级别使用其中任何一个烦恼您想要的保护:-i prompt before every removal -I prompt once before removing more than three files, or when removing recursively. Less intrusive than -i, while still giv‐ ing protection against most mistakes
因此,例如,要
rm
在每次删除之前提示您,请将这一行添加到~/.bashrc
~/.profile`:alias rm='rm -i'
trash-cli
按照建议安装类似的东西,然后rm
为其创建别名:alias rm='trash-put'
现在,您删除的任何文件
rm
都将被放置在 中~/.local/share/Trash/files/
。mv
按照@Rinzwind 的建议,采用自己动手的方法。
1 这取决于您如何具体改变其行为,它可能会没问题,但也可能会中断。
答案3
trash-cli 可能适合你的需求
sudo apt-get install trash-cli
http://www.webupd8.org/2010/02/make-rm-move-files-to-trash-instead-of.html
编辑:
您还可以备份 rm,然后用脚本替换所有出现的 rm
#!/usr/bin/python3
from sys import argv
from subprocess import Popen
args = ''
for arg in argv[1:]:
args += arg + ' '
Popen('trash '+args, shell=True)
然后使用
chmod +x rm
尽管我不知道这到底有多安全。
答案4
所有建议的答案都适用于您的命令行体验。但让我提出我的个人建议:不要那样做。 绝不。
理由:你应该知道你在做什么;认为rm
有一个安全网(用别名、可执行文件的全局更改(1)等)会让你变得自信,你将要当安全网因某种原因不存在时,就会犯下大错误——这可能是更新、另一个系统或其他什么。
该rm
命令是一个(复杂的)外壳,解除链接()家庭系统调用--- 将其视为处理文件的 Linux 内核服务 (2)。许多程序只会使用系统调用,完全绕过您的安全网。
例如,命令
find . -name test2.aux -delete
strace
将直接调用 unlink,正如你通过使用它所看到的:
strace find . -name test2.aux -delete
...
unlinkat(AT_FDCWD, "test2.aux", 0) = 0
...
...我敢打赌 SFTP 服务器也会这样做。这些超出了别名或rm
二进制替换的“保护”范围。
即使是简单的mv
、cp
或 也> file
可能会破坏安全网之外的文件。
唯一安全的方法就是做好备份(3)。学会经常这样做,并仔细检查所有命令。如果以 root 身份运行,则检查三遍。
脚注:
(1)不要这样做,除非替换命令准备好准确接受rm
管理的所有标志和角点条件。
(2)事实上,情况要复杂得多。
(3)或者在内核层面实现,可能使用具有某种长期记忆的文件系统(版本文件系统)我记得在 80 年代末与 VMS 合作过——文件系统在内核级别,确实记住了文件的所有版本,并在名称后附加了“;1”、“;2”等。这很方便,但维护起来却很麻烦。