我父亲刚刚给我讲了一个关于他的一个同事的故事,他的论文几乎完成了,正乘飞机飞往丹麦和一个朋友讨论这个问题。他在他的电脑上玩耍,并创建了一个名为“*.tex”的文件。当飞行接近尾声时,他想删除文件,所以他告诉 Unix rm -rf '*.tex'
,并意外删除了他的论文。除了不创建名为的文件之外,我如何避免这种情况*
?
5 回答
只需通过添加前面的 '\' 来转义 '*'。rm \*.tex
完美运行。此外,rm -rf
除非您真的确定自己在做什么,否则永远不要做任何事情。
r 和 f 代表 [r] 递归和 [f] 强制。这意味着,如果您使用该命令定位一个目录,它将立即且不可挽回地删除该目录、其所有文件、所有子目录及其所有文件,依此类推,直到树的末尾。
您只需要正确地单引号即可。自己试试这个:
$ mkdir tmp
$ cd tmp
# Create a file named '*.tex', containing the string 'foo'
$ echo 'foo' > '*.tex'
# Create a file named 'bar.tex', containing the string 'bar'
$ echo 'bar' > 'bar.tex'
$ ls
$ rm '*.tex'
$ ls
rm -i \*.tex
-i
用于交互;您可以对每个删除的文件说是或否;它是 的对立面-rf
。反斜杠防止星号被扩大,所以你应该只被提供*.tex
而不是thesis.tex
太多。您可以在名称周围使用引号 - 在这种情况下,单引号或双引号都可以。如果特殊字符是反引号或美元符号,则需要单引号。
如果您有点担心可能会删除哪些文件名,那么使用交互模式会很有用。如果您使用rm -fr
,则必须确保它会执行您想要的操作(您在正确的目录中,通配符会执行您期望的操作)。如果您在运行时以 root 身份登录,则需要停下来三思而后行,然后再按回车;一个错误可能是致命的。
我还会观察到,如果论文不受版本控制且没有备份,那么这位同事的生活就很危险。如果它很重要,请将其备份(并尽可能将其置于版本控制之下)。
减轻文件系统上的人为错误或硬件/软件故障损坏的常用方法是建立可靠的备份过程。
然而,在飞机上进行备份并不是特别实用,但现在像 ZFS 和 btrfs 等支持轻量级快照的写时复制文件系统越来越流行,拥有一个处理常规快照的守护进程本来可以挽救论文。
轶事结尾的问题是“我该如何避免这种情况”。
如果您想避免意外删除文件,可以将rm
命令别名如下(将此行添加到启动脚本中):
alias rm='rm -i'
这将确保每次删除文件时,都会询问您“您确定”吗?
当然,关于转义 '*' 的所有其他答案都是有效的——但这是你的“万无一失”的把戏。
不同的 shell 的语法略有不同 - 所以看看你需要什么......