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 geholt. Ich würde gerne wissen, ob es möglich ist, 'rm' im Terminal so zu überladen, dass die Datei / Dateien auf dem Weg nach draußen in den Papierkorb verschoben werden.
Ich würde Aliasing nicht empfehlen rm
, mv
da Sie sich möglicherweise angewöhnen, Dateien nichtrm
dauerhaft zu löschen und dann auf anderen Computern oder unter anderen Benutzerkonten auf Probleme stoßen, wenn sie dauerhaft gelöscht werden.
Ich habe eine Reihe von bash
Skripten geschrieben, die weitere Mac OS X-ähnliche Befehlszeilen-Tools hinzufügen (zusätzlich zu einigen der integrierten wie open
, pbcopy
, pbpaste
, usw.), vor allem trash
. Meine Version von trash
wird all die richtigen Dinge tun, die Aliasing rm
nicht tut (und hoffentlich nichts Schlimmes, aber ich verwende es seit einigen Jahren auf meinen eigenen Macs ohne Datenverlust), einschließlich: Umbenennen der Datei, wie es der Finder tut wenn eine Datei mit demselben Namen bereits vorhanden ist, Dateien im richtigen Papierkorbordner auf externen Volumes ablegen; Es hat auch einige zusätzliche Feinheiten, wie: es versucht, AppleScript zu verwenden, wenn es verfügbar ist, damit Sie den netten Trash-Sound und dergleichen erhalten (aber es ist nicht erforderlich, damit Sie es immer noch über SSH verwenden können, wenn kein Benutzer angemeldet ist), es kann geben Ihnen Papierkorbgröße über alle Volumes hinweg.
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 trash
Befehl, der von Ali Rantakari entwickelt wurde , aber ich habe ihn nicht selbst getestet.
trash
benutze Rantakari schon seit einiger Zeit und kann mich wirklich dafür verbürgen. Es ist in Objective-C kompiliert und verwendet geschickt Standard-Dateisystem-APIs und ruft, falls es fehlschlägt (dh der Benutzer hat nicht genügend Rechte), den Finder auf, um die Dateien zu löschen (was effektiv zur Authentifizierung auffordert). Weitere Informationen finden Sie trash
unter hasseg.org/blog .brew install trash
.trash
über Homebrew verfügbare Befehl ist der von Alai Rantakari (siehe die brew
Formel ).trash
Kommando seit Jahren und es gefällt mir. Aber ich habe auf Yosemite aktualisiert und es funktioniert nicht mehr. Ich erhalte eine Fehlermeldung -bash: /usr/bin/trash: /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby: bad interpreter: No such file or directory
. Weiß jemand, wie man das beheben kann?brew remove trash
und dann ausführte brew install trash
.rm
) und dann alternative Lösungen bereitzustellen. Andere scheinen sicherlich der Meinung zu sein, dass meine Antwort die Frage am gründlichsten beantwortet hat, aber ich bin gerne bereit, meinen ersten Absatz zu erweitern, wenn Sie der Meinung sind, dass dies hilfreich wäre.trash
Befehl, der von installiert wurde brew install trash
. Um es klar zu sagen, dieser Papierkorb verwendet standardmäßig nicht mehr den Finder, daher funktioniert "Put Back" nicht, es sei denn, Sie verwenden ein Flag. Selbst wenn Sie das Flag verwenden, treten häufig Fehler auf (weshalb die Standardeinstellung geändert wurde). Morgants Drehbuch ist also von höherer Qualität. Es kann mithilfe von zinit mit diesem Befehl installiert werdenzinit wait'1' lucid light-mode as"program" pick"src/trash" for morgant/tools-osx
Das Papierkorb -Befehlszeilentool kann über brew install trash
oder installiert werden port install trash
.
Es ermöglicht Ihnen, gelöschte Dateien über die Befehlszeile oder den Finder wiederherzustellen.
port install trash
brew install trash
, erhalte ich Folgendes: pastebin.com/N92cM7d8brew update
zuerst? Funktioniert gut auf meiner Seite.Ich habe rem
irgendwo in meinem eine ausführbare Datei $PATH
mit folgendem Inhalt aufgerufen:
BEARBEITEN: Der folgende Code 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 .)
~/bin
, nannte es trash
, und es funktionierte beim ersten Mal – es ermöglichte mir, eine ganze Menge Dateien viel effizienter zu löschen, als wenn ich sie in Finder-Fenstern anklicken müsste. Viel Dankbarkeit. Ich hoffe du schreibst noch mehr Antworten!'
Zeichen in Dateinamen. Ich habe versucht, es mit einer dieser "(John Doe's conflict copy)"-Dateien zu verwenden, die Dropbox manchmal erstellt, als es bei mir fehlschlug.osascript
wenn die Datei nicht existiert ist nicht schön, also möchten Sie vielleicht diesen Teil stimmen.rm
so weit wie möglich zu imitieren, was die Anzeige von Meldungen betrifft, wenn Dateien nicht existieren, und (2) fasst alles in einem einzigen osascript
Aufruf zusammen./usr/local/bin
(oder, /usr/local/share
wenn Sie es vorziehen) installiert werden. Benennen Sie die Datei /usr/local/bin/trash
, und: sudo chmod a+rx usr/local/bin/trash
.Verwenden Sie den Terminalbefehl osascript, den AppleScript-Interpreter.
osascript -e "tell application \"Finder\" to delete POSIX file \"${PWD}/${InputFile}\""
Dies weist AppleScript an, Finder anzuweisen, die Datei in den Papierkorb zu verschieben.
PWD wird für relative Dateipfade benötigt, da AppleScript nicht so gut damit umgehen kann.
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)
}
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
local dst=${path##*/}
mit local dst=${mindtrailingslash##*/}
und Einfügen einer weiteren Zeile direkt vor derjenigen, die sagt local mindtrailingslash=${path%/}
. ② Ich verwende den Namen function rr
. Auf diese Weise stört es nicht plain rm
, aber der Name ist ähnlich kurz und schnell zu tippen (jeder andere Name würde auch reichen).rm()
in rmt()
- Auf diese Weise können Sie den rm
Befehl weiterhin verwenden, wenn Sie möchten. Ich denke an rmt in meinem Kopf als remove to trash
:DEs gibt zwei über Homebrew installierbare Dienstprogramme , die dies bewerkstelligen können:
Dies ist ein kleines Befehlszeilenprogramm für OS X, das Dateien oder Ordner in den Papierkorb verschiebt. Der USP dieses Befehls besteht darin, dass die Dateien einfach wiederhergestellt werden können. Ein Befehl zum Löschen von Dateien/Ordnern nützt nichts, wenn Sie Dateien/Ordner nach dem Löschen nicht wiederherstellen können. Von der Website des Kommandos:
Standardmäßig fordert der Papierkorb den Finder auf, die angegebenen Dateien/Ordner in den Papierkorb zu verschieben, anstatt die System-API aufzurufen, um dies zu tun, da die Funktion "Zurücklegen" nur funktioniert, wenn Dateien über den Finder in den Papierkorb verschoben werden.
-F
Bitten Sie den Finder, die Dateien in den Papierkorb zu verschieben, anstatt die System-API zu verwenden. Dies ist langsamer, aber es verwendet die Benutzeroberfläche von Finder (z. B. Sounds) und stellt sicher, dass die Funktion "Zurücklegen" funktioniert.
-l
Listen Sie Elemente auf, die sich derzeit im Papierkorb befinden. Wenn dieses Argument verwendet wird, müssen keine Dateien angegeben werden.
-e
Den Papierkorb leeren. trash bittet um Bestätigung, bevor diese Aktion ausgeführt wird. Wenn dieses Argument verwendet wird, müssen keine Dateien angegeben werden.
Führen Sie zur Installation trash
Folgendes im Terminal aus:
brew install trash
.
Ein Befehlszeilentool, das Dateien in den Papierkorb verschiebt. Aus 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 entscheiden, dass Sie diese Datei doch wollen ...
-u BENUTZERNAME
ein optionales Argument. Dadurch wird die Datei in den Papierkorb des angegebenen Benutzers verschoben. Beachten Sie, dass Sie dazu ausreichende Berechtigungen benötigen.
Führen Sie zur Installation rmtrash
Folgendes im Terminal aus:
brew install rmtrash
.
Hier ist eine ziemlich triviale einzeilige Lösung, die Sie Ihrem Bash-Profil hinzufügen können. Beachten Sie, dass es bereits etwas mit dem gleichen Namen im Papierkorb überschreibt.
trash() { mv -fv "$@" ~/.Trash/ ; }
Verwendung:
• ~/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 $$$
Dies ist eine Verbesserung der Antworten von Antony Smith und cde .
Das Problem beim Einbetten eines Dateinamens in einen String, der an osascript
via übergeben -e
wird, besteht darin, dass Dateinamen auf modernen Unix-ähnlichen Systemen Anführungszeichen enthalten können, sodass Teile des Dateinamens als AppleScript ausgeführt werden könnten.
Eine sicherere Möglichkeit, dies zu tun, besteht darin, den Dateinamen aus einer Umgebungsvariablen zu lesen:
trash() (
: "${1:?}"
case $1 in
(/*) FNAME="$1" ;;
(*) FNAME="$(pwd)/$1"
esac
export FNAME
exec osascript <<-EOF >/dev/null
set fName to system attribute "FNAME"
tell application "Finder" to delete my (POSIX file fName)
EOF
)
Wenn Sie diese Funktion zu Ihrem .bashrc
oder hinzufügen, können Sie sie von der Befehlszeile aus .zshrc
aufrufen . EDIT: Obwohl es natürlich mehr Arbeit erfordert, dies in eine Funktion zu verwandeln, die tatsächlich nützlich ist.trash
Obwohl es möglich ist, rm
Dateien in den Papierkorb zu verschieben, anstatt sie zu entfernen, würde ich davon abraten, die Denkweise des Sicherheitsnetzes grafischer Benutzeroberflächen auf die UNIX-Shell zu übertragen. Es gibt viele Möglichkeiten, mit dem Terminal ernsthaften Schaden anzurichten. Der beste Rat ist IMHO, einfach zweimal nachzudenken, bevor Sie die enterTaste in einem Shell-Fenster drücken.
Wenn Sie Sie rm
daran erinnern möchten, dass Sie im Begriff sind, eine Datei zu löschen, sollten Sie den folgenden Alias verwenden ( /bin/bash
um diese Zeile .bashrc
in Ihr Home-Verzeichnis einzufügen):
alias rm "rm -i"
Dadurch wird die rm
Anforderung bestätigt, bevor versucht wird, jede Datei zu entfernen.
Wenn Sie TimeMachine laufen haben (ich hoffe es!), können Sie Ihre Datei immer aus dem Backup holen. Auf diese Weise können Sie höchstens eine Stunde Arbeit verlieren. Was natürlich schon schlimm genug ist. Denken Sie also noch einmal nach, bevor Sie diese enterTaste drücken!
rm
den Alias verwenden und hängen bleiben rm -i
..bashrc
wird nur ausgeführt, wenn die Shell interaktiv ist. Überprüfen Sie die Manpage !rm
das sicherer ist als es ist, was Sie auf anderen Systemen in Schwierigkeiten bringen wird. Auch wenn Sie verwenden -f
, -i
wird vollständig ignoriert. Das heißt, dies ist ein gutes Sicherheitsnetz. Besser ist es, niemals rm
zugunsten eines rmi
Alias ( alias rmi="rm -i"
) oder des exzellenten trash
Dienstprogramms zu verwenden. Außerdem füge ich hinzu, dass inzwischen jeder seine eigenen eingesteckt haben [ -f ~/.bashrc ] && source ~/.bashrc
sollte .bash_profile
.Sachen richtig zu vernichten (so dass sie definitiv wiederherstellbar sind) ist kniffliger als einfach ein mv
to ~/.Trash
.
osx-trash könnte das sein, wonach Sie suchen. ( Vorbehalt : Ich habe es nicht ausprobiert und kann nicht dafür bürgen, wie sicher es ist.)
Auschecken trash-cli
. Es funktioniert plattformübergreifend, ohne Trash-Sound und unterstützt Put Back.
Sie können es installieren mit (erfordert Node.js ) :
$ npm install --global trash-cli
Wenn Sie Node.js nicht verwenden möchten, können Sie alternativ die native Binärdatei osx-trash
manuell installieren.
Versuchen Sie in Ihrer .bashrc-Datei (oder wo auch immer Sie die Parameter für Ihre Shell aufbewahren) einen Alias hinzuzufügen, der das Verhalten von rm dahingehend ändert, Dinge nach ~/.Trash zu verschieben, wie in:
alias rm='move/to/.Trash'
Dieser Alias ist jedoch alles andere als trivial zu implementieren (zumindest für mich), da die Verwendung von mv (der beste Kandidat für diesen Job) ist
mv file where
Ein Alias zu haben, der den „Wo“-Teil vor die zu verschiebende Datei stellt, könnte also ziemlich skizzenhaft sein. Ich schaue mir das mal an und bekomme vielleicht noch fundiertere Tipps.
BEARBEITEN: Ich habe gerade versucht, Folgendes zu meiner .bashrc hinzuzufügen, und es funktioniert:
function trash { mv "$@" ~/.Trash ; }
Es ist viel primitiver als andere Vorschläge, aber Sie vermeiden es, neues Zeug zu installieren.
rm
auf irgendetwas ist gefährlich, da es Installationsskripte beschädigen kann. Ich habe das auf die harte Tour gelernt, als ich einen Alias rm
hatte rm -i
und Installationen hängen blieben.rm
anstelle von verwendet wurde rm -f
und das Skript beim Warten hängen blieb zur Bestätigung, dass es in Ordnung war, eine Datei zu löschen. Durch das Entfernen des Alias aus meiner .bashrc konnte die Installation abgeschlossen werden, und ich habe seitdem davon Abstand genommen, diesen Alias unter OS X zu verwenden, obwohl ich ihn immer noch auf jedem anderen Unix-System verwende. Ich bin mir nicht sicher, was Ihr Alias mit tun wird rm -f someFile
..bashrc
wird nur für interaktive Shells verwendet. Beim Ausführen wird ./install.sh
ein neuer Prozess gestartet und der Alias ist nicht aktiv. Wenn Sie jedoch . install.sh
Ihren aktuellen Prozess ausführen, wird das Installationsprogramm ausgeführt und der Alias ist aktiv. RTFM...rm -i
mithilfe ps
von die Befehlszeile angezeigt wurde, und ich habe das Problem behoben, indem ich den rm
Alias entfernt habe. YMMVrm
Befehl nicht mit einem Alias zu versehen, wie Morgant sagte, da Sie sich damit anfreunden werden rm
, Dateien nicht wirklich zu entfernen, und dann möglicherweise versehentlich etwas 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 wie nur mv {} ~/.Trash
. Befindet sich die Datei beispielsweise auf einem separaten Volume, wird die Datei in Ihr Home-Verzeichnis
kopiert und das Original gelöscht.function trash { mv "$@" ~/.Trash ; }
zu vermeiden, dass Ordnernamen mit Leerzeichen beschädigt werden.Ich habe einfach dieses Skript gesetzt
#!/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 ausführbar chmod +x ~/bin/trash
und fügte die folgende Zeile hinzu~/.bash_profile
PATH=$PATH:$HOME/bin
Dann kann man es so verwenden
$ trash broken.js olddir cleanup.*
Mit einer einfachen Funktion können Sie Dateien in den Papierkorb verschieben, indem Sie sie in den .Trash-Ordner des Benutzers verschieben:
trash() {
mv $1 ~/.Trash
}
$*
anstelle von $1
, aber dann würden Sie am Ende dieselbe Antwort wie erhalten mv "$@" ~/.Trash
. Warum die Leute es negativ bewerten, überprüfen Sie die Kommentare der anderen Antwort.
Bilderstürmer
ThorBeschwörer