如何使“ rm”文件移至垃圾桶?


62

我每天使用终端,我会经常使用rm DirectoryName。有时候我有点发疯了rm *。可以想象,这些恶作剧有时会回来打我的脸。有谁知道我如何创建映射rm whatever,然后将所有内容移到垃圾桶,然后手动删除。


3
你可以做mv /file/to/delete ~./Trash

6
在不破坏其他脚本的情况下,很难将训练轮放在诸如rm之类的精密工具上。诸如此类的事情alias rm=/bin/rm -i应该使您安全地摆脱疯狂。另外-您要rm使用哪个垃圾箱目录?由于Mac OS X为每个卷都有一个垃圾箱目录以及一个用户级别的垃圾箱,因此它变得笨拙。
bmike

1
如果您使用zsh,则默认情况下会提示您执行以下操作,rm *或者rm /path/*
Daniel Serodio 2013年

1
将我添加到认为这是一个如此危险的问题的人列表中。如果您为我工作,我会努力不给您打耳光,直到您答应在shell提示符下承诺绝不要“发疯”并发出诸如“ rm”之类的命令。我还要再次确保您没有我使用或负责的任何计算机的sudo管理特权。在键入“ rm”或“ sudo”之前,我会站起来问自己是否100%确信自己了解自己将要做的事情。也许您只需要做一个“ rm -rf”并忍受一段时间。
Wilfred Smith

如果我的评论看起来很残酷,请提前道歉,但是这个问题使我感到震惊。
威尔弗雷德·史密斯

Answers:


79

馊主意

使用rm移动文件到垃圾桶就像杂草。这很普遍而且令人愉悦,但将来可能对您不利。;)

使用时,您确实需要控制自己rm


不要使用rm

想象一下,您已经习惯了搬到垃圾桶并养成习惯。当然,您的系统是安全的,但是当您登录到朋友(或妻子或老板)的笔记本上时,必须删除某些内容吗?您实际上将使用rmreal-永久删除这些文件。这是个坏习惯,您需要知道这一点。

因此,安装rmtrash并养成使用它的习惯:

# install rmtrash, (either from the macports or by the brew.)
$ alias trash="rmtrash"
$ alias   del="rmtrash"       # del / trash are shorter than rmtrash

纠正不良习惯

你可以强迫自己使用的另一件事情rmtrash,而不是rm为别名它在你的自定义消息.profile

alias rm="echo Use 'del', or the full path i.e. '/bin/rm'"

因此,无论何时使用rm,都会提示您使用rmtrash/bin/rm。请记住,这只是暂时的,过一会儿您应该删除别名。


永远不要做这样的事情:

$ pwd
/
$ cd /tnp; rm -rf *
sh: cd: /tnp: No such file or directory

弹出测验:rm命令将在哪个目录中运行?:)

附:刚刚删除了对这篇文章的一些不必要的编辑,这增加了一些关于别名的废话。


14
&&是你的生命线。;是魔鬼。PS答案是,在上面的示例中,系统上的几乎所有东西都消失了。
詹森·萨拉兹

虽然rm不会进行安全删除,但是(在我的设置中)移至回收站/空确实可以。
2014年

1
例如,Debian / Ubuntu用户安装trash-cliaptitude install trash-cli-参见github.com/andreafrancia/trash-cli
Daniel Sokolowski

@ jm666还请检查垃圾博客文章来源)。它要求Finder删除文件。而且,它还可以使用标准的Objective C文件系统API(更快),如果权限不足,可以回退到Finder。brew install trash
Parth

rmtrash它确实很老,最近一次更新是在2003年,它显示了。rm与相比,它的选项要少得多,如果rmtrash在辅助卷上说,它将这些文件移动到系统驱动器上用户的废纸folder文件夹中,这对于大型文件可能会花费很长时间。trash由parth推荐的选项更好,可以解决体积相同的问题,但仍然缺少许多rm选项。
沃伦·杨

25

我可以想到许多方法来编码,但是断然拒绝在答案中键入任何一种。我强烈建议您遏制自己发疯的习惯。如果不能正确使用rm,则根本不应该养成使用习惯。

这里的根本问题是,即使您在自己的系统上安装了安全网,也只会帮助您保持不良习惯,并且当您某天碰巧遇到另一台没有相同自定义保护功能的计算机时,您将做一些明显的坏事。

正确的解决方案是按rm原样使用,包括-i在怀疑全局扩展如何时手动添加参数,并具有良好的系统备份,如果出现严重的用户错误,可以将其还原。试图在宇宙的其余部分不使用的命令中添加“垃圾”是一个半途而废的做法,这是两全其美的做法。

要么使用垃圾桶,要么不使用。使用rm不会浪费,它会删除。

如果您想使用垃圾桶,那没有任何问题。只是养成使用rmtrash命令而不是的习惯rm。这将帮助您的大脑了解正在发生的事情,并且不会使您养成不良习惯,这种不良习惯以后会引起悲伤。


1
您的积分在这种情况下不会计算。人们每天都在不小心删除某些东西,由于资源有限,在家用PC(属于我的)的情况下,系统备份无法正常工作,移至垃圾桶是一种针对我的特定情况处理这些删除的更有效的方法用例。
史蒂夫

5
@steve,您完全错过了重点。rm根据定义,从磁盘上删除文件。它不会将其发送到垃圾箱。rm当您要发送到垃圾桶时,要教自己使用,这会给您带来灾难。如果您想发送到垃圾箱,使用rmtrash该作业或设计用于该作业的程序,那么以后就不会遇到噩梦。我并不是说使用垃圾桶本质上是错误的,但是如果您要使用垃圾桶,请勿将其连接到不打算使用的垃圾桶上!
卡莱布

2
brew install rmtrash并停止使用rm
GabLeRoux,2014年

这是一个很棒的答案,为我清除了一些东西。我会养成使用rmtrash代替的习惯rm
Sheharyar 2015年

sudo add-apt-repository ppa:nateshmbhat / rm-trash。然后安装“ rm-trash”
Natesh bhat

3

有一些方法可以保护您免受可怕的后果rm。但是,我同意这里的其他评论者:很少有什么好。

暂时不要相信更改命令环境会有所帮助。例如,您会发现到处都有在线人推荐这样做:

alias rm="rm -i"

要么

function rm()
{
    echo >&2 'rm forbidden; use "/bin/rm"'
}
export -f rm

这是行不通的。期。在许多用例中,这些小技巧将使您痛苦不堪。

我过去避免遭受危险的唯一可靠方法rm是通过cron在我工作的目录上设置常规备份过程。Raw UNIX可以非常轻松地为您很好地完成此任务,find结合使用-mtime和检查在一定时间内或之后已经更新的文件。


+1 cron独自一人。谢谢:)
bmike

2

使用rmtrash之类的命令行工具,或者使用tat使用appscript的脚本调用Finder进行删除。

在安装rmtras说/ usr / local / bin / rmtrash之后,为bash创建别名

alias rm='rmtrash'

您可以使用\ rm直接调用rm并忽略别名


14
如果您确实使用过这样的工具rmtrash,请帮自己一个忙,并以自己的名字使用它。永远不要rm给不喜欢的东西加上别名rm,它总有一天会咬你的。
卡莱布

1
rmtrash与不兼容rm(不支持类似的命令行参数-r),因此别名在任何情况下都没有用
Perry

将别名rmtrash为别名是一个坏主意rm。它们不仅不兼容,而且还会养成不良习惯,并且您会rm以为仅使用会意外地在另一个系统中使用rmtrash
Fayaz

1

只是想添加一个有益的习惯,以适应尚未这样做的人。在将rm用于任何事物之前,请先对其执行'ls'操作。这样,您可以看到要删除的所有文件。然后,无需重新键入命令,只需拉出先前的“ ls”命令并将ls换为rm。这种习惯在调用rm时减轻了很多焦虑。


-1

简介(您可以跳过)

对我来说rm -i就足够了,因为它会在删除任何文件之前提示您。但是,提供的一些额外安全性safe-rm并不是一个坏主意。

一个简单的aliaslike rm=safe-rm -i 可能就足够了,但是rm -rf将不起作用,因为-i已被覆盖-f

因此,我们必须确保-i始终紧追其后-f


我的解决方案(3个步骤):

  • 安装safe-rm: brew install safe-rm

    您仍然可以使用rm,但是RM_BIN在下一步中已修改

  • 编辑您的~/.profile(或bash_profile或其他内容),然后放入以下代码段(其中包含aliasfunction):

    alias rm="rm_i"
    
    function rm_i(){
    RM_BIN=safe-rm # you can replace it with regular rm if you like
    
    args=""
    files=""
    argsDone=0 # to make sure arguments are before the files
    
    for var in "$@"
    do
        if [[ $var == \-* ]] ; then
            if [ $argsDone -eq 1 ] ; then
                $RM_BIN # just to show the usage of rm
                return
            fi
            args+=" $var"
        else
            argsDone=1
            files+=" $var"
        fi
    done
    
    args+=" -i" # Put -i at the end (so rm -rf will not ignore it)
    
    $RM_BIN $args $files
    }
    
  • 最后logoutlogin,因此将应用.profile中的更新。注销/登录前请勿使用它!


笔记:

  • 只需稍加修改即可将其应用于任何Linux发行版。
  • 它不会使您的员工陷入困境。它只是在删除每个文件之前询问您!
  • -rf与正则表达式一起使用。
  • 如果您确实要使用而rm -rf 无需询问每个文件/文件夹,则仍然可以使用/bin/rm -rf(或safe-rm -rf是否已安装)。
  • 不再有无意 rm -rf rm * ;)

5
将rm别名为大于其自身的任何值(例如alias rm='sudo rm'),就像将Uzi绑在菜刀上一样:有一天,当您去切菠萝时,您将获得比讨价还价更多的收益。将rm别名为小于其自身的任何值(例如alias rm='rmtrash'),就像让您的孩子玩着未武装的手榴弹,而不是教他们实际的东西一样:有一天,当他们遇到一个真实的手榴弹时,他们将不会给予适当的谨慎对待。无论哪种方式-混淆rm都对您的人身安全和公共健康有害!
Caleb 2014年

2
使用诸如safe-rm之类的东西是合理的建议。将其别名为rm并非如此。以其自己的名称或唯一的别名使用它,这样您就不会认为安全网不会永远存在。
Caleb 2014年

我明白你的意思。但是,我这样做的原因是,我在许多终端上工作..一些远程终端和一些本地人。我想在远程终端上投掷很多手榴弹,但是当我不小心拉动本地终端上的安全封条时,我想在爆炸发生之前看到警告
Paschalis 2014年

@Paschalis,如果需要使用脚本或已安装的程序rm怎么办?同样,Caleb的观点甚至更有效-如果您习惯了使用安全rm别名的系统,那么您可能会不计后果地使用它,并最终将其用于无别名rm的系统上。
Manishearth
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.