别名rm命令并使其更安全的最佳实践


21

前段时间我错误地删除了我的主文件夹,因为我rm -rf *在错误的终端上运行了一个,其工作目录是主文件夹!

我希望我有一个rm命令的别名,但事实并非如此。

现在,我打算将脚本作为别名rm

你有什么最好的建议吗?

谢谢。


7
并不是说我没有同情心,但我认为这不是rm一个需要安全别名的危险命令。通过使用rf选项,你告诉shell 我知道这是危险的,我仔细考虑过它,它是_really_我想做什么。如果您不使用这些选项,则无法使用它删除整个主文件夹。
user26512

此问题是否包含与stackoverflow.com/questions/373156 / ... 相同的信息?
大卫哈里斯

1
@grossvogel没有冒犯:)!但是,别名此命令是一种常见做法。很多人使用-f选项来避免确认每次删除。

23
请注意,如果您使用别名,rm您将习惯该别名。然后有一天,你将会在别名不存在的系统上,当你最不期望它时,你会做错事。它可能不会是你的系统。
Stefan Lasiewski

2
@puller只有像RHEL系统是愚蠢的别名rmrm -i
Daniel Beck

Answers:


30

如果您想要自定义rm,请不要将其rm称为您的名称myrmdelete或其他任何名称。

rm='rm -i'别名是恐怖,因为它使用了一段时间后,你会希望rm在默认情况下删除文件前提示你。当然,有一天你会使用一个没有设置别名的帐户运行它,在你了解正在发生的事情之前,已经太晚了。

无论如何,为文件丢失或损坏做好准备的好方法是进行备份。

保护您免受意外删除或覆盖文件的快速替代方法是使用支持无限快照(如ZFS)的文件系统。如果频繁快照是自动完成的,则可以在事件发生前的最后一个快照期间恢复文件。  


3
我个人从遭受它的人那里听到了这个恐怖故事。
Dan D.

我同意,但大多数人不能自由切换到完全不同的文件系统。
Peon

实际上,这就是我首先建议进行备份的原因,这是一个没有文件系统禁止的功能。
jlliagre

12

如果您想要保存别名,但又不想冒险习惯在系统上使用不同于其他命令的命令,则可以禁用rm这样的

alias rm='echo "rm is disabled, use remove or trash or /bin/rm instead."'

然后你可以创建自己的安全别名,例如

alias remove='/bin/rm -irv'

或者trash改为使用。


1
请注意(至少在某些版本中)您必须以其他顺序定义别名。按照您提供的顺序执行此操作定义removeecho "rm is disabled, use trash or /bin/rm instead." -irv。而且,就常识问题而言,您是否希望消息rm来引用您的安全remove命令?
斯科特

你是对的,我会相应地更新答案。
Dario Seidl

5

您可以尝试使用trash。记得偶尔把它清空一次......


3

无需更改每个人的配置文件,您可以做的是在目录中放置名为-i的文件。

# touch -- -i
# ll
total 0
-rw-r--r-- 1 root users  0 Jan 26 19:24 files
drwxr-xr-x 2 root users 40 Jan 26 19:24 folder_of_power
-rw-r--r-- 1 root root   0 Jan 26 19:25 -i
-rw-r--r-- 1 root users  0 Jan 26 19:24 important
-rw-r--r-- 1 root users  0 Jan 26 19:24 very
# rm -rf *
rm: remove regular empty file `files'? 

如果用户决定使用*将无法工作。*而不仅仅是*。但仍然是一个巧妙的伎俩。
Peon

1
afaik rm -rf。并且rm -rf ..无法成功,因为您当前在目录中。
Peon

@Peon:我相信你的意思.* *,而不是* .*(我认为更常见)或* . *(你说的)。............ ............ ................................................................................................................................................................................................................................................................................................................................................... 。但我同意,这是一个巧妙的伎俩。
斯科特

1

我使用以下脚本。

#!/bin/sh

trash=$HOME/tmp
mv "$@" $trash
nohup find "$trash" -type f -atime +7 -exec /bin/rm '{}' \; 2>&1 &

如果您不小心删除了文件,请从中恢复$HOME/tmp

tmp如果访问时间为7天(脚本自动清理$HOME/tmp目录),脚本会将删除的文件移动到目录并在下次运行删除脚本时将其删除。


-2

在你的个人资料中

alias rm="rm -i"

3
在我看来,别名是一个很糟糕的建议,无论如何在拉马的情况下它都无济于事。
jlliagre

rm -I给予两全其美,@ jlliagre。
Tamara Wijsman

@Tom Wijsman,部分确实如此。更改关键标准Unix命令的行为仍然是一个潜在的风险。如果您希望它是交互式的,请为别名指定其他名称。
jlliagre

@jlliagre:嗯,你的意思是脚本确实抓住了这个变化?
Tamara Wijsman 2012年

请阅读我的回复superuser.com/a/382498/19279以获取我的观点。
jlliagre

-2

一个d带有内容的脚本mv $* /tmp

编辑:这是个坏主意; 见下文。我目前alias d='mv -t /tmp'在我的.profile代替。


2
这个建议是危险的,可以a)覆盖已经被删除的同名文件或b)删除完全错误的文件(d "foo bar"将删除文件foobar)。更安全的东西可能是#!/bin/bash TRASH="$( mktemp -d -t trashed.XXX )"; echo "Moving to trash $TRASH"; mv -v -- "$@" "$TRASH"mktempmv语法取决于你的系统,这一个工程对于Linux)。
Daniel Beck

2
感谢您的解释。问题a我很好但问题b)是个大问题。我改变了我的d命令,alias d='mv -t /tmp'我的.profile; 我认为这是我正在寻找的简单解决方案。
beefus 2013年

-2

此bash代码将该函数添加rm~/.bash_profile配置文件中。运行此操作后,如果您编写rm file,则将该文件移动到/tmp

cat << EOF >> ~/.bash_profile
rm () {
  mv $1 /tmp
}
EOF

1
这个脚本/代码做什么?请解释一下,技术水平较低的用户可以理解你的答案。
Vylix

2
虽然这可能会回答这个问题,但如果您能提供一些解释,为什么会这样做,那将是一个更好的答案。
DavidPostill

1
这确实提供了问题的答案,但这是一个非常糟糕的问题。已经发布了这个答案的两个更好的版本。
斯科特

此bash代码将该函数添加rm~/.bash_profile配置文件中。运行此文件后,如果您编写rm file,则将该文件移动到/tmp
维森特·冈萨雷斯

谢谢你的解释。你可以编辑你的答案,把它包含在帖子中吗?
Ben N
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.