Hago mucho trabajo de terminal, y hoy tuve la experiencia de escribir
rm fileInQuestion.txt
Antes de descubrir que realmente necesitaba fileInQuestion.txt. Si lo hubiera eliminado en la GUI, lo habría sacado de la Papelera. Me gustaría saber si es posible sobrecargar 'rm' en la Terminal de tal manera que envíe el archivo/archivos a la Papelera al salir.
No recomendaría crear un alias rm
, mv
ya que podría tener el hábito de rm
no eliminar archivos de forma permanente y luego tener problemas en otras computadoras o en otras cuentas de usuario cuando se elimine de forma permanente.
Escribí un conjunto de secuencias de bash
comandos que agregan más herramientas de línea de comandos similares a Mac OS X (además de varias de las integradas como open
, pbcopy
, pbpaste
, etc.), lo más importante trash
. Mi versión de trash
hará todas las cosas correctas que el alias rm
no hará (y espero que nada malo, pero lo he estado usando en mis propias Mac durante algunos años sin perder datos), incluido: cambiar el nombre del archivo como lo hace Finder si ya existe un archivo con el mismo nombre, colocar los archivos en la carpeta Papelera correcta en volúmenes externos; también tiene algunas sutilezas añadidas, como: intenta usar AppleScript cuando está disponible para obtener el agradable sonido de basura y demás (pero no lo requiere, por lo que aún puede usarlo a través de SSH cuando ningún usuario ha iniciado sesión), puede le dará el tamaño de la papelera en todos los volúmenes.
Puede obtener mi suite tools-osx de mi sitio o la última y mejor versión del repositorio de GitHub .
También hay un trash
comando desarrollado por Ali Rantakari , pero no lo he probado yo mismo.
trash
Rantakari durante bastante tiempo y realmente puedo dar fe de ello. Está compilado en Objective-C y utiliza hábilmente las API estándar del sistema de archivos y, en caso de que falle (es decir, el usuario no tiene suficientes derechos), llama al Finder para que deseche los archivos (efectivamente solicitando la autenticación). Puede leer más información trash
en hasseg.org/blog .brew install trash
.trash
comando disponible a través de Homebrew es el de Alai Rantakari (ver la brew
fórmula ).trash
comando de Ali Rantakari durante años y me gusta. Pero actualicé a Yosemite y dejó de funcionar. Me sale un error diciendo -bash: /usr/bin/trash: /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby: bad interpreter: No such file or directory
. ¿Alguien sabe cómo arreglar esto?brew remove trash
y luego brew install trash
.rm
) y luego proporcionar soluciones alternativas. Sin duda, otros parecen sentir que mi respuesta respondió más completamente a la pregunta, pero me complace ampliar mi primer párrafo si cree que sería útil.trash
comando alternativo instalado por brew install trash
. Para ser claros, esa papelera ya no usa el Finder de forma predeterminada, por lo que "Volver a colocar" no funcionará a menos que use una bandera. Incluso cuando usa la bandera, a menudo falla (razón por la cual se cambió el valor predeterminado). Entonces, el guión de morgant es de mayor calidad. Se puede instalar usando zinit con este comandozinit wait'1' lucid light-mode as"program" pick"src/trash" for morgant/tools-osx
La herramienta de línea de comandos de basura se puede instalar a través brew install trash
de o port install trash
.
Le permite restaurar archivos desechados a través de la línea de comandos o el Finder.
port install trash
brew install trash
me sale esto: pastebin.com/N92cM7d8brew update
primero? Funciona bien en mi extremo.Tengo un ejecutable llamado rem
en algún lugar de mi $PATH
con el siguiente contenido:
EDITAR: el código a continuación es una versión revisada y mejorada en colaboración con 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
Se comporta exactamente de la misma manera que eliminar desde el Finder. (Ver entrada de blog aquí .)
~/bin
, lo llamé trash
y funcionó la primera vez, lo que me permitió eliminar una gran cantidad de archivos de manera más eficiente que si tuviera que hacer clic en ellos en las ventanas del Finder. Mucha gratitud. ¡Espero que publiques más respuestas!'
caracteres en los nombres de los archivos. Estaba tratando de usarlo con uno de esos archivos "(copia de conflicto de John Doe)" que a veces crea Dropbox, cuando falló en mí.osascript
cuando el archivo no existe no es hermoso, por lo que es posible que desee afinar esa parte.rm
tanto como sea posible en términos de mostrar mensajes cuando los archivos no existen, y (2) recopila todo en una sola osascript
llamada./usr/local/bin
(o, /usr/local/share
si lo prefiere). Asigne un nombre al archivo /usr/local/bin/trash
y: sudo chmod a+rx usr/local/bin/trash
.Utilice el comando de terminal osascript, el intérprete de AppleScript.
osascript -e "tell application \"Finder\" to delete POSIX file \"${PWD}/${InputFile}\""
Esto le dice a AppleScript que le diga a Finder que envíe el archivo a la papelera.
Se necesita PWD para rutas de archivo relativas, ya que AppleScript no lo maneja bien.
un enfoque moderno usando 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)
}
Encontré un código bastante bueno que se puede agregar al final del perfil de lote del usuario y hace rm
que los archivos se muevan a la papelera cada vez que se ejecuta.
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
}
fuente: http://hints.macworld.com/article.php?story=20080224175659423
local dst=${path##*/}
con local dst=${mindtrailingslash##*/}
e insertando otra línea justo antes de la que dice local mindtrailingslash=${path%/}
. ② Yo uso el nombre function rr
. Así, no interfiere con plain rm
, pero el nombre es igualmente corto y rápido de escribir (cualquier otro nombre serviría).rm()
a rmt()
: de esta manera, puede seguir usando el rm
comando cuando lo desee. Pienso en rmt en mi cabeza como remove to trash
:DHay dos utilidades instalables a través de Homebrew que pueden lograr esto:
Este es un pequeño programa de línea de comandos para OS X que mueve archivos o carpetas a la papelera. La USP de este comando es que permite restaurar fácilmente los archivos. Un comando para eliminar archivos/carpetas no sirve de nada si no puede restaurar archivos/carpetas después de eliminarlos. Desde el sitio web del comando:
De forma predeterminada, la papelera le pide a Finder que mueva los archivos/carpetas especificados a la papelera en lugar de llamar a la API del sistema para hacerlo debido a la función "devolver" que solo funciona cuando se envían archivos a la papelera a través de Finder.
-F
Pídale a Finder que mueva los archivos a la papelera, en lugar de usar la API del sistema. Esto es más lento, pero utiliza la interfaz de usuario de Finder (por ejemplo, sonidos) y garantiza que la función "retroceder" funcione.
-l
Enumere los elementos que se encuentran actualmente en la papelera. Si se utiliza este argumento, no es necesario especificar ningún archivo.
-mi
Vacíe la basura. trash pide confirmación antes de ejecutar esta acción. Si se utiliza este argumento, no es necesario especificar ningún archivo.
Para instalar trash
, ejecute lo siguiente en la Terminal:
brew install trash
.
Una herramienta de línea de comandos que mueve archivos a la papelera. Desde la página del manual del comando:
Este comando mueve los archivos a la papelera en lugar de eliminarlos por completo del sistema de archivos. Muy útil si decides que quieres ese archivo después de todo...
-u NOMBRE DE USUARIO
un argumento opcional. Esto moverá el archivo a la papelera del usuario especificado. Tenga en cuenta que necesita suficientes privilegios para lograr esto.
Para instalar rmtrash
, ejecute lo siguiente en la Terminal:
brew install rmtrash
.
Aquí hay una solución de una línea bastante trivial para agregar a su perfil bash. Tenga en cuenta que sobrescribirá algo con el mismo nombre en la papelera.
trash() { mv -fv "$@" ~/.Trash/ ; }
Uso:
• ~/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 $$$
Esta es una mejora de las respuestas dadas por Antony Smith y cde .
El problema de incrustar un nombre de archivo en una cadena que se pasa a osascript
través -e
es que, en los sistemas modernos similares a Unix, los nombres de archivo pueden contener comillas, en el sentido de que partes del nombre de archivo podrían ejecutarse como AppleScript.
Una forma más segura de hacer esto es leer el nombre del archivo desde una variable de entorno:
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
)
Si agrega esta función a su .bashrc
o .zshrc
, puede llamar trash
desde la línea de comando. EDITAR: aunque convertir esto en una función que sea realmente útil requiere más trabajo, por supuesto.
Si bien es posible rm
mover archivos a la Papelera en lugar de eliminarlos, desaconsejaría llevar la mentalidad de la red de seguridad de las interfaces gráficas de usuario al shell de UNIX. Hay muchas formas de causar daños graves utilizando el terminal. El mejor consejo en mi humilde opinión es simplemente pensar dos veces antes de presionar la entertecla en una ventana de shell.
Si desea rm
recordarle que está a punto de eliminar un archivo, considere usar el siguiente alias (para /bin/bash
colocar esta línea en .bashrc
su directorio de inicio):
alias rm "rm -i"
Esto hará que se rm
confirme la solicitud antes de intentar eliminar cada archivo.
Si tiene TimeMachine ejecutándose (¡eso espero!), siempre puede obtener su archivo de la copia de seguridad. De esta manera puede perder como máximo una hora de trabajo. Lo cual es bastante malo, por supuesto. ¡Así que piénsalo de nuevo antes de presionar esa entertecla!
rm
y bloquearse con el alias rm -i
..bashrc
solo se ejecuta si el shell es interactivo. ¡ Consulte la página del manual !rm
es más seguro de lo que es, lo que lo meterá en problemas en otros sistemas. Además, si usa -f
, -i
se ignora por completo. Dicho esto, esta es una buena red de seguridad. Una mejor es nunca usar rm
a favor de un rmi
alias ( alias rmi="rm -i"
) o la trash
utilidad relevante. Además, agregaré que todos deberían haber puesto [ -f ~/.bashrc ] && source ~/.bashrc
su .bash_profile
ya.Desechar correctamente las cosas (para que sea definitivamente recuperable) es más complicado que simplemente un mv
archivo ~/.Trash
.
osx-trash podría ser lo que estás buscando. ( Advertencia emptor : no lo he probado y no puedo garantizar qué tan seguro es).
En su .bashrc (o donde sea que guarde los parámetros para su shell), intente agregar un alias que cambie el comportamiento de rm para mover cosas a ~/.Trash, como en:
alias rm='move/to/.Trash'
Sin embargo, este alias está lejos de ser trivial de implementar (al menos para mí), porque el uso de mv (el principal candidato para usar en este trabajo) es
mv file where
por lo tanto, tener un alias que coloque la parte "dónde" delante del archivo que se va a mover puede ser bastante incompleto. Lo investigaré y podría obtener consejos más sustanciales.
EDITAR: acabo de intentar agregar lo siguiente a mi .bashrc, y funciona:
function trash { mv "$@" ~/.Trash ; }
Es mucho más primitivo que otras sugerencias, pero evita instalar cosas nuevas.
rm
para cualquier cosa es peligrosa porque puede romper los scripts del instalador. Aprendí esto de la manera más difícil cuando hice un alias rm
y las rm -i
instalaciones se bloquearon.rm
lugar de rm -f
y el script estaba colgado esperando. para confirmar que estaba bien eliminar algún archivo. Eliminar el alias de mi .bashrc permitió que se completara la instalación y desde entonces me he abstenido de usar ese alias en OS X, aunque todavía lo uso en todos los demás sistemas Unix. No estoy seguro de qué hará tu alias con rm -f someFile
..bashrc
solo se usa para shells interactivos . Si ejecuta ./install.sh
un nuevo proceso se inicia y el alias no estará activo. Sin embargo, si ejecuta . install.sh
su proceso actual, se ejecutará el instalador y el alias estará activo. RTF...rm -i
utilizando ps
para ver la línea de comando y solucioné el problema eliminando el rm
alias. YMMVrm
comando, como dijo morgant, porque se sentirá cómodo con rm
no eliminar archivos y luego podría eliminar accidentalmente algo en un sistema donde no se ha agregado dicho alias. Además, mover un archivo a la papelera no es tan simple como simplemente mv {} ~/.Trash
. Si el archivo está en un volumen separado, por ejemplo, esto copiará el archivo a su directorio de inicio y eliminará el original.function trash { mv "$@" ~/.Trash ; }
evitar que se rompa en los nombres de las carpetas con espacios.Simplemente he puesto este script
#!/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
, lo hizo ejecutable chmod +x ~/bin/trash
y agregó la siguiente línea a~/.bash_profile
PATH=$PATH:$HOME/bin
Entonces uno puede usarlo como
$ trash broken.js olddir cleanup.*
Una función simple podría permitirle eliminar archivos moviéndolos a la carpeta .Trash del usuario:
trash() {
mv $1 ~/.Trash
}
$*
en lugar de $1
, pero terminaría con la misma respuesta que mv "$@" ~/.Trash
. Por qué la gente lo vota negativamente, verifique los comentarios de la otra respuesta.
iconoclasta
ThorInvocador