如何从命令行将文件移至垃圾箱?


128

我做了很多终端工作,今天有打字的经验

rm fileInQuestion.txt

在发现我确实需要fileInQuestion.txt之前。如果我在GUI中删除了它,那我将把它从垃圾箱中删除。我想知道是否有可能在终端中过载“ rm”,从而在出站时将文件发送到垃圾箱。


1
有些程序可以恢复已删除的文件(只要同时不覆盖硬盘驱动器上的那些扇区!)。发生这种情况时,您应该使用其中一种...
iconoclast 2014年

对于正在寻找ubuntu / debian / linux文件垃圾邮件的Google 员工,还请参见askubuntu.com/q/468721/250556
ThorSummoner

Answers:


100

我不会建议别名rmmv,你可能会在习惯得到rm不永久删除文件,然后运行到其他计算机上或下的其他用户帐户时,它的问题永久删除。

我写了一组bash是(多项内置者的除了像添加更多的Mac OS X样的命令行工具脚本openpbcopypbpaste等),最重要的trash。我的版本trash将执行别名rm不会发生的所有正确操作(希望没什么不好,但是几年来我一直在自己的Mac上使用它,而不会丢失任何数据),包括:重命名文件,就像Finder一样。如果已经存在同名文件,则将文件放在外部卷上正确的“废纸folder”文件夹中;它还具有一些附加的优点,例如:它尝试在可用时尝试使用AppleScript,以便获得不错的垃圾声音(例如,但不需要它,因此在没有用户登录时仍可以通过SSH使用它),它可以为您提供所有卷中的废纸size大小。

您可以从我的网站上获取我的tools-osx套件,或者从GitHub存储库中获取最新最好的版本。

还有一个trash由Ali Rantakari开发的命令,但是我自己还没有测试过。


4
出色的答案,比我的要好得多!
user1256923 2012年

24
我已经trash被Rantakari使用了很长时间,并且可以为其提供担保。它是由Objective-C编译的,并且巧妙地使用标准文件系统API,并且如果失败(即用户没有足够的权限),它将调用Finder来丢弃文件(有效地提示进行身份验证)。您可以trashhasseg.org/blog阅读更多信息。
加里·基纳嫩(JariKeinänen)2012年

26
也可以通过冲煮包装管理器获得垃圾。只需使用:brew install trash
Landon Kuhn

8
@ landon9720好点。并且,为了使其他人更清楚,trash可通过Homebrew使用的命令是Alai Rantakari的命令(请参见brew公式)。
morgant

3
我能够通过运行brew remove trash然后修复错误brew install trash
Elias Zamaria 2015年

98

垃圾命令行工具可以通过安装brew install trash

它使您可以通过命令行或Finder恢复已删除的文件。


2
多么优雅的解决方案!
裴先生

6
在macports中也可用:port install trash
holocronweaver 2015年

每次尝试时brew install trash,我都会得到:pastebin.com/N92cM7d8
Ben Leggiero 2015年

@ BenC.R.Leggiero我将把这个问题交给github.com/ali-rantakari/trash/issues。你是brew update第一个吗 对我来说效果很好。
Paul Wenzel

@PaulWenzel是的,它似乎更新得很好。我将发布一个问题。
Ben Leggiero 2015年

21

rem在我的某处有一个可执行文件$PATH,其内容如下:

编辑:以下代码是与Dave Abrahams合作的修订和改进版本

#!/usr/bin/env python
import os
import sys
import subprocess

if len(sys.argv) > 1:
    files = []
    for arg in sys.argv[1:]:
        if os.path.exists(arg):
            p = os.path.abspath(arg).replace('\\', '\\\\').replace('"', '\\"')
            files.append('the POSIX file "' + p + '"')
        else:
            sys.stderr.write(
                "%s: %s: No such file or directory\n" % (sys.argv[0], arg))
    if len(files) > 0:
        cmd = ['osascript', '-e',
               'tell app "Finder" to move {' + ', '.join(files) + '} to trash']
        r = subprocess.call(cmd, stdout=open(os.devnull, 'w'))
        sys.exit(r if len(files) == len(sys.argv[1:]) else 1)
else:
    sys.stderr.write(
        'usage: %s file(s)\n'
        '       move file(s) to Trash\n' % os.path.basename(sys.argv[0]))
    sys.exit(64) # matches what rm does on my system

它的行为与从Finder中删除的行为完全相同。(请参见此处的博客文章。)


4
IMO应该有更多的观点。因为它是AppleScript,所以它使用实际的废纸process过程将文件移到废纸,,这意味着它的行为将完全相同。可惜没有提供一线。
mxcl

2
这个答案是正确做事的客观课程。它与外壳通配符一起使用并且可以通过Finder使用。它不会重塑任何轮子,而且非常简单。我将其放在自己的文件中~/bin,并将其命名为trash,它第一次起作用-使我能够比必须在Finder窗口中单击它们更高效地丢弃大量文件。非常感谢。希望您能发布更多答案!
本·科维兹

3
此版本处理引号。它会稍微改变错误处理行为,在上述版本中,它似乎不是很认真地解决(将错误输出到stdout而不是stderr,没有退出代码),但是osascript当文件不存在时会收到错误不是很漂亮,所以您可能需要调整该部分。
戴夫·亚伯拉罕斯'18

3
不错的工作。此版本合并了这些更改,并且(1)尝试rm在文件不存在时尽可能多地模仿shell命令以显示消息,并且(2)将所有内容整理到一个osascript调用中。
安东尼·史密斯


4

我发现了一个不错的代码,可以将其添加到用户的批处理配置文件的末尾,并rm在每次运行时将文件移至垃圾箱。

纳米〜/ .bash_profile

#... append at the end
function rm () {
  local path
  for path in "$@"; do
    # ignore any arguments
    if [[ "$path" = -* ]]; then :
    else
      # remove trailing slash
      local mindtrailingslash=${path%/}
      # remove preceding directory path
      local dst=${mindtrailingslash##*/}
      # append the time if necessary
      while [ -e ~/.Trash/"$dst" ]; do
        dst="`expr "$dst" : '\(.*\)\.[^.]*'` `date +%H-%M-%S`.`expr "$dst" : '.*\.\([^.]*\)'`"
      done
      mv "$path" ~/.Trash/"$dst"
    fi
  done
}

来源:http : //hints.macworld.com/article.php?story=20080224175659423


2
这很聪明,但我仍然不建议这样做。这很聪明,因为它位于用户的bash配置文件中,因此只有用户才能通过键入该功能来执行此版本的功能,依赖rm的脚本仍将调用原始功能。但是我不建议您这样做,因为当用户不在其他计算机上时,它将习惯于以这种方式执行rm。我将使用此功能,但将功能重命名为“垃圾箱”
Matt Parkins 2014年

我使用的是同一个函数,但有两个更改:①我纠正了该函数中的一个错误,该错误导致将任何文件夹重命名为时间戳(如果已将制表符完整地包含了斜杠):这需要进行以下更改:线local dst=${path##*/}local dst=${mindtrailingslash##*/},只是那一个,说之前插入另一条线local mindtrailingslash=${path%/}。我用这个名字function rr。像这样,它不会与plain互斥rm,但其名称同样简短且易于键入(任何其他名称都可以)。
2015年

将名称更改rm()rmt()-这样,您仍然可以在rm需要时使用命令。我认为rmt是remove to trash:D
James111'1

4

使用终端命令osascript,AppleScript解释器。

osascript -e "tell application \"Finder\" to delete POSIX file \"${PWD}/${InputFile}\""

这告诉AppleScript告诉Finder将文件发送到垃圾箱。

相对文件路径需要PWD,因为AppleScript处理得不好。


1
简单,有效,无需安装任何东西!真好
SilverWolf

2

快速的现代方法

https://github.com/reklis/recycle

//
// main.swift
// recycle
//
// usage: recycle <files or directories to throw out>
//

import Foundation
import AppKit

var args = NSProcessInfo.processInfo().arguments
args.removeAtIndex(0) // first item in list is the program itself

var w = NSWorkspace.sharedWorkspace()
var fm = NSFileManager.defaultManager()

for arg in args {
    let path = arg.stringByStandardizingPath;
    let file = path.lastPathComponent
    let source = path.stringByDeletingLastPathComponent

    w.performFileOperation(NSWorkspaceRecycleOperation,
        source:source,
        destination: "",
        files: [file],
        tag: nil)
}

1
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
jherran

@jherran感谢您的提醒,我添加了一个代码段
slf

这是我的首选答案,因为它使用与GUI相同的基础逻辑和API。
Jason R. Coombs 2015年

1
现在,如果只有Python版本可以避免使用3MB二进制文件进行一次系统调用。
杰森·库姆斯

1

尽管可以将rm移动文件替换为“废纸rash”而不是删除它们,但我建议不要将图形用户界面安全网的思想带入UNIX Shell。有很多方法可以使用终端进行严重损坏。恕我直言,最好的建议是在击中entershell窗口中的键之前,请三思而后行。

如果要rm提醒您即将删除文件,请考虑使用以下别名(/bin/bash将此行.bashrc放入您的主目录中):

alias rm "rm -i"

这将rm在尝试删除每个文件之前进行请求确认。

如果您正在运行TimeMachine(希望如此!),则始终可以从备份中获取文件。这样,您最多只能损失一个小时的工作。当然,这已经够糟糕了。因此,在按下该enter键之前,请三思!


1
不要做!安装程序脚本可以使用rm别名并挂起rm -i
老职业

3
@OldPro:.bashrc仅在外壳为交互式时才执行。检查手册页
Mackie Messer'5

我建议不要移除安全网,或劝告他人这样做。
the0ther

我会反对反对者,说我使用这个技巧效果很好,但是绝对应该知道陷阱后才做。没有提到的两个是,它训练您的大脑rm比现在更安全,这会使您在其他系统上遇到麻烦。另外,如果你使用-f-i完全被忽略。也就是说,这是一个很好的安全网。一个更好的是不要使用rm赞成的rmi别名(alias rmi="rm -i")或优秀的trash工具。另外,我要补充的是每个人都应该把[ -f ~/.bashrc ] && source ~/.bashrc他们的.bash_profile现在。
mattmc3

1

可以通过Homebrew安装两个实用程序来完成此任务:

  1. 垃圾

    这是OS X的小型命令行程序,可将文件或文件夹移至回收站。此命令的USP可以轻松还原文件。如果您在删除文件/文件夹后无法恢复文件/文件夹,则该命令将无效。在命令的网站上:

默认情况下,由于要求仅在通过Finder删除文件时起作用的“回送”功能,trash会要求Finder将指定的文件/文件夹移动到垃圾桶中,而不是调用系统API来执行此操作。


-F

要求Finder将文件移至回收站,而不要使用系统API。这比较慢,但是它利用Finder的UI(例如声音)并确保“回送”功能有效。

-l

列出垃圾箱中当前的项目。如果使用此参数,则无需指定文件。

-e

清空垃圾。垃圾桶在执行此操作之前要求确认。如果使用此参数,则无需指定文件。

要安装trash,请在终端中运行以下命令:

brew install trash


  1. 垃圾桶

    将文件移至垃圾箱的命令行工具。在命令的手册页中:

此命令将文件移至垃圾桶,而不是将其从文件系统中完全删除。如果您最终决定要该文件,则非常有用...


-u用户名

可选参数。这会将文件移到指定用户的回收站。请注意,您需要足够的特权才能完成此操作。

要安装rmtrash,请在终端中运行以下命令:

brew install rmtrash


1

这是添加到bash个人资料中的非常简单的单行解决方案。请注意,它将已经覆盖垃圾箱中具有相同名称的内容。

trash() { mv -fv "$@" ~/.Trash/ ; }

用法:

 ~/Desktop $$$ touch a b c
 ~/Desktop $$$ ls
a b c
 ~/Desktop $$$ trash a b c
a -> /Users/ryan.tuck/.Trash/a
b -> /Users/ryan.tuck/.Trash/b
c -> /Users/ryan.tuck/.Trash/c
 ~/Desktop $$$ ls
 ~/Desktop $$$

已经进行了相应的编辑-感谢您的输入!
瑞安·塔克

0

适当地乱扔东西(以便绝对可以回收)比简单地给mvto 棘手~/.Trash

osx-trash可能就是您想要的。(警告购买者 -我没有尝试过,也无法保证它的安全性。)



-1

在您的.bashrc中(或在任何保留shell参数的位置),尝试添加一个别名,该别名将rm的行为更改为将内容移动到〜/ .Trash,如下所示:

alias rm='move/to/.Trash'

不过,这个别名不是很容易实现(至少对我而言),因为使用mv(用于此工作的主要候选人)是

mv file where

因此,使用别名将“ where”部分放置在要移动的文件前面可能会很粗略。我会研究它,可能会得到更多实质性的建议。

编辑:我只是试图将以下内容添加到我的.bashrc,它可以工作:

function trash { mv "$@" ~/.Trash ; }

它比其他建议原始得多,但是您避免安装新的东西。


3
混淆rm任何东西都是危险的,因为它可能会破坏安装程序脚本。我了解到这个硬盘的方式,当我别名rmrm -i,不得不安装挂起。
老职业

@Old Pro,这是我从第0天起在所有计算机上使用rm的别名,因此我从来没有遇到过问题。想举个例子吗?
user1256923 2012年

3
@OldPro:.bashrc仅用于交互式外壳。如果您运行./install.sh新的进程,则别名将无效。但是,如果您运行. install.sh当前进程,则会执行安装程序,并且别名处于活动状态。RTFM ...
Mackie Messer'5

3
然后安装程序正在运行交互式外壳,因此被严重破坏。通常,一个损坏的安装程序不足以建议您不使用Shell别名。YMMV
Mackie Messer'5

1
但是,它很好的建议不是别名rm命令,morgant说,因为你将成为舒适与rm不真正删除文件,然后可能会意外地删除其中没有这样的别名已添加的系统上的东西。另外,将文件移到垃圾箱并不只是那么简单mv {} ~/.Trash。例如,如果文件在单独的卷上,这会将文件复制到您的主目录并删除原始文件。
乔什

-1

我只是把这个脚本

#!/bin/bash
application=$(basename "$0")
if [ "$#" == 0 ]; then
    echo "Usage: $application path [paths...]"
    exit 1
fi
trashdir="/Users/${USER}/.Trash"
while (( "$#" )); do
    if [ -e "$1" ]; then
        src=$(basename "$1")
        dst=$src
        while [ -e "$trashdir/$dst" ]; do
            dst=$src+`date +%H-%M-%S`
        done
        mv -f "$1" "$trashdir/$dst"
    else
        echo "$1" does not exist.
    fi
    shift
done

在中~/bin/trash,使其可执行chmod +x ~/bin/trash,并在~/.bash_profile

PATH=$PATH:$HOME/bin

然后可以将其用作

$ trash broken.js olddir cleanup.*

-2

一个简单的功能可以让您通过将文件移动到用户的.Trash文件夹中来删除文件:

trash() {
   mv $1 ~/.Trash
}

?为什么要投反对票?这将是我的想法以及..
CousinCocaine

您可能需要$*而不是$1,但是最终您将得到与相同的答案mv "$@" ~/.Trash。为什么人们对它投反对票,请检查其他答案的评论。
kenorb

注意这个别名;如果您只有一个分区或驱动器,则此方法有效。如果您正在处理第二个卷或网络共享,则实际上会将文件复制到主目录的回收站,这可能不是您想要的!
jmk 2015年
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.