Wie verschiebe ich Dateien von der Kommandozeile in den Papierkorb?

129

Ich mache viel Terminalarbeit und hatte heute die Erfahrung des Tippens

rm fileInQuestion.txt

Bevor ich herausfand, dass ich tatsächlich fileInQuestion.txt brauchte. Wenn ich in der GUI gelöscht hätte, hätte ich es gerade aus dem Papierkorb entfernt. Ich würde gerne wissen, ob es möglich ist, 'rm' im Terminal so zu überladen, dass es die Datei (en) auf dem Weg nach draußen in den Papierkorb schickt.

Joe
quelle
1
Es gibt Programme, die gelöschte Dateien wiederherstellen können (solange diese Sektoren auf der Festplatte in der Zwischenzeit nicht überschrieben werden!). In diesem Fall sollten Sie einen dieser ...
iconoclast
Siehe auch askubuntu.com/q/468721/250556 für Googler, die nach Ubuntu / Debian / Linux suchen.
ThorSummoner

Antworten:

100

Ich würde nicht Aliasing raten rmzu , mvwie Sie in der Gewohnheit bekommen könnten rmnicht dauerhaft Löschen von Dateien und führen Sie dann in Probleme auf anderen Computern oder unter anderen Benutzerkonten , wenn sie nicht dauerhaft löschen.

Ich schrieb eine Reihe von bashSkripten , die mehr Mac OS X-ähnlichen Kommandozeilen - Tools (zusätzlich zu einer Reihe von integrierten in denjenigen wie hinzufügen open, pbcopy, pbpaste, etc.), was am wichtigsten ist trash. Meine Version von trashwird alle korrekten Dinge tun, die Aliasing rmnicht kann (und hoffentlich nichts Schlechtes, aber ich verwende es seit einigen Jahren auf meinen eigenen Macs ohne Datenverlust), einschließlich: Umbenennen der Datei wie Finder Wenn bereits eine Datei mit demselben Namen vorhanden ist, werden die Dateien auf externen Datenträgern in den richtigen Papierkorb verschoben. Außerdem wurden einige Besonderheiten hinzugefügt, z. B .: Es wird versucht, AppleScript zu verwenden, wenn es verfügbar ist, damit Sie den netten Trash-Sound und dergleichen erhalten (dies ist jedoch nicht erforderlich, sodass Sie es weiterhin über SSH verwenden können, wenn kein Benutzer angemeldet ist) Geben Sie die Papierkorbgröße für alle Volumes an.

Sie können meine tools-osx-Suite von meiner Website oder die neueste und beste Version aus dem GitHub-Repository herunterladen .

Es gibt auch einen trashBefehl, der von Ali Rantakari entwickelt wurde , aber ich habe diesen selbst nicht getestet.

morgant
quelle
4
Ausgezeichnete Antwort, viel besser als meine!
user1256923
24
Ich habe trashRantakari schon eine ganze Weile benutzt und kann mich wirklich dafür verbürgen. Es ist mit Objective-C kompiliert und verwendet geschickt Standard-Dateisystem-APIs. Sollte es fehlschlagen (dh der Benutzer hat nicht genügend Rechte), ruft es Finder auf, um die Dateien in den Papierkorb zu werfen (um effektiv zur Authentifizierung aufzufordern). Sie können weitere Informationen von lesen trashvon hasseg.org/blog .
Jari Keinänen
26
Müll ist auch über den Sudpaket-Manager erhältlich. nur benutzen brew install trash.
Landon Kuhn
8
@ landon9720 Guter Punkt. Und um für andere klar zu stellen , ist der trashBefehl , der über Homebrew verfügbar ist, der von Alai Rantakari (siehe die brewFormel ).
Morgant
3
Ich konnte den Fehler durch Ausführen von brew remove trashund dann beheben brew install trash.
Elias Zamaria
99

Das Papierkorb- Kommandozeilen-Tool kann über installiert werden brew install trash.

Hiermit können Sie über die Befehlszeile oder den Finder gelöschte Dateien wiederherstellen.

Paul Wenzel
quelle
2
Was für eine elegante Lösung!
Herr Pei
6
Auch in Macports erhältlich:port install trash
holocronweaver
Jedes Mal, wenn ich es versuche brew install trash, erhalte ich
Folgendes
@ BenC.R.Leggiero Ich würde dieses Problem auf github.com/ali-rantakari/trash/issues übertragen . Hast du brew updatezuerst? Funktioniert gut an meinem Ende.
Paul Wenzel
@PaulWenzel ja, und es scheint ganz gut zu aktualisieren. Ich werde ein Problem posten.
Ben Leggiero
21

Ich habe remirgendwo in meinem eine ausführbare Datei $PATHmit folgendem Inhalt aufgerufen :

BEARBEITEN: Code unten ist eine überarbeitete und verbesserte Version in Zusammenarbeit mit 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

Es verhält sich genauso wie das Löschen aus dem Finder. (Siehe Blogbeitrag hier .)

Anthony Smith
quelle
4
Dies sollte mehr Punkte IMO haben. Da es sich um AppleScript handelt, wird der eigentliche Papierkorb verwendet, um die Datei in den Papierkorb zu verschieben, was bedeutet, dass sie sich genauso verhält. Schade, dass ein Einzeiler nicht vorgesehen war.
mxcl
2
Diese Antwort ist eine Lektion, wie man Dinge richtig macht. Es funktioniert mit Shell-Platzhaltern und über den Finder. Es erfindet keine Räder neu und ist so einfach wie nur möglich. Ich habe es in mein eingefügt ~/bin, benannt trashund es hat beim ersten Mal funktioniert - so kann ich eine ganze Reihe von Dateien effizienter in den Papierkorb werfen, als wenn ich sie in Finder-Fenstern anklicken müsste. Vielen Dank. Ich hoffe du postest mehr Antworten!
Ben Kovitz
3
Diese Version behandelt Anführungszeichen. Es ändert etwas das Fehlerbehandlungsverhalten, was in der obigen Version nicht sehr sorgfältig ausgearbeitet zu sein scheint (Fehler in stdout anstelle von stderr, kein Exit-Code), aber der Fehler, den Sie erhalten, osascriptwenn die Datei nicht existiert ist nicht schön, also möchten Sie vielleicht diesen Teil stimmen.
Dave Abrahams
3
Gute Arbeit. Diese Version enthält diese Änderungen. Außerdem wird (1) versucht, den Shell-Befehl rmso weit wie möglich zu imitieren , um Meldungen anzuzeigen, wenn keine Dateien vorhanden sind, und (2) alles in einem einzigen osascriptAufruf zusammenzufassen.
Anthony Smith
4

Ich habe einen ziemlich netten Code gefunden, der am Ende des Stapelprofils des Benutzers hinzugefügt werden kann und bewirkt rm, dass die Dateien bei jeder Ausführung in den Papierkorb verschoben werden.

nano ~ / .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
}

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

rraallvv
quelle
2
Das ist klug, aber ich würde es trotzdem nicht empfehlen. Es ist clever, weil es im Bash-Profil für den Benutzer enthalten ist und daher nur der Benutzer diese Version der Funktion ausführen kann, indem er sie eingibt. Skripte, die auf rm basieren, rufen weiterhin das Original auf. Dies würde ich jedoch nicht empfehlen, da sich der Benutzer daran gewöhnen wird, auf diese Weise zu handeln, wenn dies auf anderen Computern nicht der Fall ist. Ich werde dies verwenden, aber die Funktion "Müll" umbenennen
Matt Parkins
Ich verwende dieselbe Funktion mit zwei Änderungen: ① Ich habe einen Fehler in der Funktion behoben, der dazu führt, dass ein Ordner in den Zeitstempel umbenannt wird, wenn er mit einem abschließenden Schrägstrich versehen wurde. Dazu sind folgende Änderungen erforderlich: Ersetzen des Zeile local dst=${path##*/}mit local dst=${mindtrailingslash##*/}und Einfügen einer weiteren Zeile kurz vor der, in der steht local mindtrailingslash=${path%/}. ② Ich benutze den Namen function rr. So stört es nicht mit plain rm, aber der Name ist ähnlich kurz und schnell einzugeben (jeder andere Name würde es tun).
Mach
Ändern Sie den Namen rm()in rmt()- Auf diese Weise können Sie den rmBefehl weiterhin verwenden, wenn Sie möchten. Ich denke an RTM in meinem Kopf als remove to trash: D
James111
4

Verwenden Sie den Terminalbefehl osascript, den AppleScript-Interpreter.

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

Dadurch wird AppleScript angewiesen, Finder anzuweisen, die Datei in den Papierkorb zu verschieben.

PWD wird für relative Dateipfade benötigt, da AppleScript dies nicht gut handhabt.

cde
quelle
1
Einfach, effektiv und ohne Installation! Nett.
SilverWolf
2

Ein moderner Ansatz mit Swift

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)
}
slf
quelle
1
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzuschließen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert.
jherran
@ jherran danke für die erinnerung, ich habe ein
codesegment
Dies ist meine bevorzugte Antwort, da sie dieselbe zugrunde liegende Logik und dieselben APIs wie die GUI verwendet.
Jason R. Coombs
1
Wenn es nur eine Python-Version gäbe, die die Notwendigkeit einer 3-MB-Binärdatei für einen Systemaufruf überflüssig macht.
Jason R. Coombs
1

Obwohl es möglich ist, rmDateien in den Papierkorb zu verschieben, anstatt sie zu entfernen, würde ich davon abraten, die Denkweise des Sicherheitsnetzes der grafischen Benutzeroberflächen auf die UNIX-Shell zu übertragen. Es gibt viele Möglichkeiten, mit dem Terminal schwerwiegende Schäden zu verursachen. Der beste Rat, IMHO, ist es, einfach zweimal zu überlegen, bevor Sie die enterTaste in einem Shell-Fenster drücken.

Wenn Sie rmdaran erinnern möchten , dass Sie im Begriff sind, eine Datei zu löschen, sollten Sie den folgenden Alias ​​verwenden ( /bin/bashum diese Zeile .bashrcin Ihr Ausgangsverzeichnis einzufügen):

alias rm "rm -i"

Dadurch wird die rmAnforderung bestätigt, bevor versucht wird, jede Datei zu entfernen .

Wenn TimeMachine ausgeführt wird (ich hoffe es!), Können Sie Ihre Datei immer aus dem Backup holen. Auf diese Weise können Sie höchstens eine Arbeitsstunde verlieren. Was natürlich schlimm genug ist. Überlegen Sie es sich also noch einmal, bevor Sie diese enterTaste drücken!

Mackie Messer
quelle
1
Tu es nicht! Installer-Skripte können rmden Alias verwenden und hängen rm -i.
Old Pro
3
@OldPro: .bashrcwird nur ausgeführt, wenn die Shell interaktiv ist. Überprüfen Sie die Manpage !
Mackie Messer
Ich würde davon abraten, Sicherheitsnetze zu entfernen oder andere zu ermahnen, dies zu tun.
06.02.14
Ich werde gegen die Neinsager vorgehen und sagen, dass ich diesen Trick mit großer Wirkung verwende, aber es sollte definitiv nur getan werden, wenn ich die Fallstricke kenne. Zwei, die nicht erwähnt werden, sind, dass es Ihr Gehirn trainiert, rmdas sicherer ist als es ist, wodurch Sie auf anderen Systemen in Schwierigkeiten geraten. Auch wenn Sie verwenden -f, -iwird völlig ignoriert. Dies ist jedoch ein gutes Sicherheitsnetz. Besser ist es, niemals rmzugunsten eines rmiAlias ​​( alias rmi="rm -i") oder des hervorragenden trashDienstprogramms zu verwenden. Ich werde auch hinzufügen , dass jeder stellen sollte [ -f ~/.bashrc ] && source ~/.bashrcin ihrer .bash_profilemittlerweile.
mattmc3
1

Es gibt zwei Dienstprogramme, die über Homebrew installiert werden können:

  1. Müll

    Dies ist ein kleines Befehlszeilenprogramm für OS X, das Dateien oder Ordner in den Papierkorb verschiebt. Das Alleinstellungsmerkmal dieses Befehls ist das einfache Wiederherstellen der Dateien. Ein Befehl zum Löschen von Dateien / Ordnern ist nicht sinnvoll, wenn Sie Dateien / Ordner nach dem Löschen nicht wiederherstellen können. Von der Website des Befehls:

Standardmäßig fordert der Papierkorb Finder auf, die angegebenen Dateien / Ordner in den Papierkorb zu verschieben, anstatt die System-API aufzurufen, um dies zu tun, da die Funktion "Zurücksetzen" nur funktioniert, wenn Dateien über Finder in den Papierkorb verschoben werden.


-F

Bitten Sie Finder, die Dateien in den Papierkorb zu verschieben, anstatt die System-API zu verwenden. Dies ist langsamer, nutzt jedoch die Benutzeroberfläche des Finders (z. B. Sounds) und stellt sicher, dass die Funktion "Zurücksetzen" funktioniert.

-l

Listet Elemente auf, die sich derzeit im Papierkorb befinden. Wenn dieses Argument verwendet wird, müssen keine Dateien angegeben werden.

-e

Den Papierkorb leeren. Der Papierkorb bittet um Bestätigung, bevor diese Aktion ausgeführt wird. Wenn dieses Argument verwendet wird, müssen keine Dateien angegeben werden.

trashFühren Sie zum Installieren im Terminal Folgendes aus:

brew install trash.


  1. rmtrash

    Ein Befehlszeilenprogramm, mit dem Dateien in den Papierkorb verschoben werden. Auf der Manpage des Befehls:

Dieser Befehl verschiebt Dateien in den Papierkorb, anstatt sie vollständig aus dem Dateisystem zu entfernen. Sehr nützlich, wenn Sie sich doch für diese Datei entscheiden ...


-u BENUTZERNAME

ein optionales Argument. Dadurch wird die Datei in den Papierkorb des angegebenen Benutzers verschoben. Beachten Sie, dass Sie hierfür ausreichende Berechtigungen benötigen.

rmtrashFühren Sie zum Installieren im Terminal Folgendes aus:

brew install rmtrash.

Nimesh Neema
quelle
1

Hier ist eine ziemlich einfache einzeilige Lösung, die Sie Ihrem Bash-Profil hinzufügen können. Beachten Sie, dass bereits etwas mit demselben Namen im Papierkorb überschrieben wird.

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

Verwendungszweck:

 ~/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 $$$
Ryan Tuck
quelle
habe entsprechend editiert - danke für die eingabe!
Ryan Tuck
0

Richtig Sachen Wegwerfen (so dass es auf jeden Fall wiederherstellbaren ist) ist schwieriger als nur ein mvzu ~/.Trash.

osx-trash könnte das sein, wonach du suchst. ( Vorbehalt - Ich habe es nicht ausprobiert und kann nicht dafür bürgen, wie sicher es ist.)

Nix
quelle
0

Auschecken trash-cli. Es funktioniert plattformübergreifend, ohne Trash-Sound und unterstützt Put Back.

Sie können es mit (erfordert Node.js ) installieren :

$ npm install --global trash-cli

Wenn Sie Node.js nicht verwenden möchten, können Sie die native Binärdatei auch osx-trashmanuell installieren .

Sindre Sorhus
quelle
-1

Fügen Sie in Ihrer .bashrc-Datei (oder wo immer Sie die Parameter für Ihre Shell behalten) einen Alias ​​hinzu, der das Verhalten von rm dahingehend ändert, dass Inhalte nach ~ / .Trash verschoben werden, wie in:

alias rm='move/to/.Trash'

Dieser Alias ​​ist jedoch alles andere als trivial (zumindest für mich) zu implementieren, da die Verwendung von mv (der Hauptkandidat, der für diesen Job verwendet werden soll)

mv file where

Ein Alias, der das "wo" vor die zu verschiebende Datei setzt, kann daher recht lückenhaft sein. Ich werde mich darum kümmern und möglicherweise umfassendere Ratschläge erhalten.

BEARBEITEN: Ich habe gerade versucht, meinem .bashrc Folgendes hinzuzufügen, und es funktioniert:

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

Es ist viel primitiver als andere Vorschläge, aber Sie vermeiden es, neue Dinge zu installieren.

user1256923
quelle
3
Das Aliasing rmauf irgendetwas ist gefährlich, da es Installer-Skripte beschädigen kann. Ich habe gelernt , auf die harte Tour , als ich aliased rmzu rm -iund hatte anbringt hängen.
Old Pro
@Old Pro, das ist der Alias, den ich von Tag 0 an für rm auf allen meinen Computern verwende, und ich hatte deshalb nie Probleme. Möchtest du ein Beispiel geben?
user1256923
3
@OldPro: .bashrcwird nur für interaktive Shells verwendet. Wenn Sie ./install.sheinen neuen Prozess ausführen , wird dieser gestartet und der Alias ​​ist nicht aktiv. Wenn Sie jedoch . install.shIhren aktuellen Prozess ausführen, wird das Installationsprogramm ausgeführt und der Alias ​​ist aktiv. RTFM ...
Mackie Messer
3
Dann hat das Installationsprogramm eine interaktive Shell ausgeführt und war daher schwer beschädigt. Ein defekter Installer ist kaum Grund genug, generell von Shell-Aliasen abzuraten. YMMV
Mackie Messer
1
Es ist jedochrm ratsam, den Befehl nicht als Alias ​​zu kennzeichnen, da Sie rmmöglicherweise versehentlich Dateien auf einem System löschen, auf dem kein solcher Alias ​​hinzugefügt wurde. Außerdem ist das Verschieben einer Datei in den Papierkorb nicht so einfach mv {} ~/.Trash. Befindet sich die Datei beispielsweise auf einem separaten Volume, wird die Datei in Ihr Ausgangsverzeichnis kopiert und das Original gelöscht.
Josh
-1

Ich habe dieses Skript einfach gestellt

#!/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

in ~/bin/trash, machte es excutable chmod +x ~/bin/trashund fügte die folgende Zeile hinzu~/.bash_profile

PATH=$PATH:$HOME/bin

Dann kann man es als verwenden

$ trash broken.js olddir cleanup.*
JP
quelle
-2

Mit einer einfachen Funktion können Sie Dateien in den Papierkorb des Benutzers verschieben:

trash() {
   mv $1 ~/.Trash
}
james.kobol
quelle
? warum eine negative Abstimmung? Das wäre auch mein Gedanke.
CousinCocaine
Sie müssen wahrscheinlich $*statt $1, aber dann würden Sie die gleiche Antwort erhalten wie mv "$@" ~/.Trash. Warum Leute es negativ bewerten, überprüfen Sie die Kommentare aus der anderen Antwort.
Kenorb
Seien Sie vorsichtig mit diesem Alias. Dies funktioniert, wenn Sie nur eine Partition oder ein Laufwerk haben. Wenn Sie an einem zweiten Volume oder einer Netzwerkfreigabe arbeiten, wird die Datei tatsächlich in den Papierkorb Ihres Home-Verzeichnisses kopiert , was wahrscheinlich nicht das ist, was Sie tun wollten!
JMK