¿Cómo mover archivos a la papelera desde la línea de comandos?

129

Hago mucho trabajo terminal, y hoy tuve la experiencia de escribir

rm fileInQuestion.txt

Antes de descubrir que realmente necesitaba fileInQuestion.txt. Si 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.

Joe
fuente
1
Hay programas que pueden recuperar archivos borrados (¡siempre y cuando esos sectores en el disco duro no se sobrescriban mientras tanto!). Cuando esto sucede, deberías usar uno de esos ...
iconoclast
Consulte también askubuntu.com/q/468721/250556 para los googlers que buscan la transferencia de archivos ubuntu / debian / linux.
ThorSummoner

Respuestas:

100

No aconsejaría aliasing rma mvcomo se podría conseguir en el hábito de rmarchivos no borrar de forma permanente y que tenga problemas en otros equipos o bajo otras cuentas de usuario cuando no desaparezca permanentemente.

Escribí un conjunto de bashsecuencias de comandos que añadir más herramientas de línea de comandos X-como Mac OS (además de un número de los que ya vienen implementadas como open, pbcopy, pbpaste, etc.), lo más importante trash. Mi versión de trashhará todas las cosas correctas que el aliasing rmno hará (y espero que nada malo, pero lo he estado usando en mis propias Mac durante algunos años sin ninguna pérdida de datos), incluyendo: 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 ventajas adicionales, como: intenta usar AppleScript cuando está disponible para que obtenga el agradable sonido de la 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 darle el tamaño de la basura en todos los volúmenes.

Puede obtener mi suite de herramientas-osx de mi sitio o la última y mejor versión del repositorio de GitHub .

También hay un trashcomando desarrollado por Ali Rantakari , pero no lo he probado yo mismo.

morgant
fuente
44
Excelente respuesta, mucho mejor que la mía!
user1256923
24
He usado trashRantakari durante bastante tiempo y realmente puedo dar fe de ello. Está compilado Objective-C y utiliza inteligentemente las API estándar del sistema de archivos y, si falla (es decir, el usuario no tiene suficientes derechos), llama a Finder para que elimine los archivos (solicitando efectivamente la autenticación). Puede leer más información de trashpartir hasseg.org/blog .
Jari Keinänen
26
la basura también está disponible a través del administrador de paquetes de café. sólo tiene que utilizar: brew install trash.
Landon Kuhn el
8
@ landon9720 Buen punto. Y, para aclarar a los demás, el trashcomando disponible a través de Homebrew es el de Alai Rantakari (ver la brewfórmula ).
Morgant
3
Pude corregir el error ejecutando brew remove trashy luego brew install trash.
Elias Zamaria
99

La herramienta de línea de comandos de la papelera se puede instalar a través de brew install trash.

Le permite restaurar archivos basura a través de la línea de comandos o el Finder.

Paul Wenzel
fuente
2
¡Qué solución tan elegante!
Sr. Pei
66
También disponible en macports:port install trash
holocronweaver
cada vez que lo intento brew install trash, obtengo esto: pastebin.com/N92cM7d8
Ben Leggiero
@ BenC.R.Leggiero Llevaría ese tema a github.com/ali-rantakari/trash/issues . ¿Lo hiciste brew updateprimero? Funciona bien de mi parte.
Paul Wenzel
@PaulWenzel sí, y parece actualizarse muy bien. Publicaré un problema.
Ben Leggiero
21

Tengo un ejecutable llamado remen algún lugar de mi $PATHcon los siguientes contenidos:

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 del Finder. (Vea la publicación del blog aquí ).

Anthony Smith
fuente
44
Esto debería tener más puntos IMO. Debido a que es AppleScript, utiliza el proceso de papelera real para mover el archivo a la papelera, lo que significa que se comportará exactamente igual. Sin embargo, lástima que no se haya proporcionado una frase.
mxcl
2
Esta respuesta es una lección objetiva sobre cómo hacer las cosas bien. Funciona con comodines de shell y funciona a través del Finder. No reinventa ninguna rueda, y es tan simple como puede ser. Lo puse en mi ~/bin, lo nombré trashy funcionó la primera vez, lo que me permitió tirar a la basura muchos archivos de manera mucho más eficiente que si tuviera que hacer clic en ellos en las ventanas del Finder. Mucha gratitud ¡Espero que publiques más respuestas!
Ben Kovitz
3
Esta versión maneja citas. Cambia un poco el comportamiento de manejo de errores, lo que en la versión anterior parece ser no muy cuidadosamente resuelto (errores para stdout en lugar de stderr, sin código de salida) pero el error que obtienes osascriptcuando el archivo no existe no es hermoso, por lo que es posible que desee ajustar esa parte.
Dave Abrahams
3
Buen trabajo. Esta versión incorpora esos cambios, y también (1) trata de imitar el comando shell rmtanto como sea posible en términos de mostrar mensajes cuando los archivos no existen, y (2) recopila todo en una sola osascriptllamada.
Anthony Smith
4

Encontré un código bastante bueno que se puede agregar al final del perfil de lote del usuario y hace rmque mueva los archivos 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

rraallvv
fuente
2
Esto es muy inteligente pero todavía no lo recomendaría. Es inteligente porque está en el perfil bash para el usuario y, por lo tanto, solo el usuario puede ejecutar esta versión de la función escribiéndola, los scripts que dependen de rm seguirán llamando al original. Pero no recomendaría hacerlo porque el usuario se acostumbrará a actuar de esta manera cuando no lo haga en otras máquinas. Voy a usar esto, pero cambie el nombre de la función "basura"
Matt Parkins
Estoy usando la misma función con dos cambios: ① Corregí un error en la función que hace que se cambie el nombre de cualquier carpeta a la marca de tiempo, si se completó con pestañas para incluir una barra inclinada: Esto requiere los siguientes cambios: Reemplazar el línea local dst=${path##*/}con local dst=${mindtrailingslash##*/}e insertar otra línea justo antes de que uno que dice local mindtrailingslash=${path%/}. ② Yo uso el nombre function rr. De esta manera, no interfiere con plain rm, pero el nombre es igualmente corto y rápido de escribir (cualquier otro nombre lo haría).
mach
Cambiar el nombre de rm()a rmt(): de esta manera, aún puede usar el rmcomando cuando lo desee. Pienso en rmt en mi cabeza como remove to trash: D
James111
4

Use 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 archivos relativas, ya que AppleScript no se maneja tan bien.

cde
fuente
1
¡Simple, efectivo y sin necesidad de instalar nada! Agradable.
SilverWolf
2

Un enfoque moderno con 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
fuente
1
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia.
jherran
@jherran gracias por el recordatorio, agregué un segmento de código
slf
Esta es mi respuesta preferida porque usa la misma lógica y API subyacentes que la GUI.
Jason R. Coombs
1
Ahora, si solo hubiera una versión de Python que evitara la necesidad de un binario de 3MB para hacer una llamada al sistema.
Jason R. Coombs
1

Si bien es posible rmmover los archivos a la Papelera en lugar de eliminarlos, aconsejaría no 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 con el terminal. El mejor consejo en mi humilde opinión es pensarlo dos veces antes de enterpresionar la tecla en una ventana de shell.

Si desea rmrecordarle que está a punto de eliminar un archivo, considere usar el siguiente alias (para /bin/bashponer esta línea .bashrcen su directorio de inicio):

alias rm "rm -i"

Esto rmconfirmará la solicitud antes de intentar eliminar cada archivo.

Si tiene TimeMachine ejecutándose (¡espero que sí!) 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 piense de nuevo antes de presionar esa entertecla!

Mackie Messer
fuente
1
¡No lo hagas! Los scripts de instalador pueden usar rmy colgarse con el alias rm -i.
Old Pro
3
@OldPro: .bashrcsolo se ejecuta si el shell es interactivo. ¡Mira la página del manual !
Mackie Messer
Aconsejaría no quitar las redes de seguridad o advertir a otros que lo hagan.
2014
Iré en contra de los detractores y diré que utilizo este truco con gran efecto, pero definitivamente solo debe hacerse conociendo las trampas. Dos de los que no se mencionan son que entrena tu cerebro de manera rmmás segura que lo que te meterá en problemas en otros sistemas. Además, si lo usa -f, -ise ignora por completo. Dicho esto, esta es una buena red de seguridad. Una mejor es nunca usar rma favor de un rmialias ( alias rmi="rm -i") o la excelente trashutilidad. Además, agregaré que todo el mundo ya debería haber puesto [ -f ~/.bashrc ] && source ~/.bashrcla .bash_profilesuya.
mattmc3
1

Hay dos utilidades instalables a través de Homebrew que pueden lograr esto:

  1. basura

    Este es un pequeño programa de línea de comandos para OS X que mueve archivos o carpetas a la papelera. El USP de este comando es el 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 manera predeterminada, la papelera le pide al Finder que mueva los archivos / carpetas especificados a la papelera en lugar de llamar a la API del sistema para hacer esto debido a la función "volver a colocar" que solo funciona al mover los archivos a través del Finder.


-F

Solicite al Finder que mueva los archivos a la papelera, en lugar de utilizar la API del sistema. Esto es más lento, pero utiliza la interfaz de usuario de Finder (p. Ej., Sonidos) y garantiza que la función "volver a colocar" funcione.

-l

Lista de elementos actualmente en la basura. Si se utiliza este argumento, no es necesario especificar archivos.

-mi

Vaciar la basura. Trash solicita confirmación antes de ejecutar esta acción. Si se utiliza este argumento, no es necesario especificar archivos.

Para instalar, trashejecute lo siguiente en la Terminal:

brew install trash.


  1. rmtrash

    Una herramienta de línea de comando que mueve archivos a la papelera. Desde la página del comando man:

Este comando mueve los archivos a la papelera en lugar de eliminarlos totalmente 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 privilegios suficientes para lograr esto.

Para instalar, rmtrashejecute lo siguiente en la Terminal:

brew install rmtrash.

Nimesh Neema
fuente
1

Aquí hay una solución de una línea bastante trivial para agregar a su perfil de bash. Tenga en cuenta que ya 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 $$$
Ryan Tuck
fuente
he editado en consecuencia, ¡gracias por el aporte!
Ryan Tuck
0

Destrozar cosas adecuadamente (para que sea definitivamente recuperable) es más complicado que simplemente un mvto to ~/.Trash.

osx-trash puede ser lo que estás buscando. ( Advertencia : no lo he probado y no puedo garantizar lo seguro que es).

Nada
fuente
0

Echa un vistazo trash-cli. Funciona multiplataforma, sin sonido de basura y admite Put Back.

Puede instalarlo con (requiere Node.js ) :

$ npm install --global trash-cli

Alternativamente, si no desea utilizar Node.js, puede instalar el binario nativo osx-trashmanualmente.

Sindre Sorhus
fuente
-1

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 para implementar (al menos para mí), porque el uso de mv (el principal candidato para usar para este trabajo) es

mv file where

Por lo tanto, tener un alias que ponga la parte 'dónde' delante del archivo a mover podría 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.

usuario1256923
fuente
3
Alias rma cualquier cosa es peligroso porque puede romper los scripts de instalación. Esto lo aprendí de la manera difícil cuando un alias rmpara rm -iy tenía instalaciones cuelgan.
Old Pro
@Old Pro, ese es el alias que uso para rm en todas mis computadoras, desde el día 0, y nunca tuve problemas por eso. ¿Te importa dar un ejemplo?
user1256923
3
@OldPro: .bashrcsolo se usa para shells interactivos . Si ejecuta ./install.shun nuevo proceso, se inicia y el alias no estará activo. Sin embargo, si ejecuta . install.shsu proceso actual, ejecutará el instalador y el alias estará activo. RTFM ...
Mackie Messer
3
Luego, el instalador estaba ejecutando un shell interactivo y, por lo tanto, estaba seriamente dañado. Un instalador roto no es razón suficiente para desaconsejar los alias de shell en general. YMMV
Mackie Messer
1
Sin embargo, es un buen consejo no rmusar el alias del comando, como dijo Morgant, porque se sentirá cómodo con rmno eliminar realmente los archivos y luego podría eliminar accidentalmente algo en un sistema donde no se haya agregado dicho alias. Además, mover un archivo a la papelera no es tan simple como solo 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.
Josh
-1

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

en ~/bin/trash, lo hizo ejecutable chmod +x ~/bin/trashy agregó la siguiente línea a~/.bash_profile

PATH=$PATH:$HOME/bin

Entonces uno puede usarlo como

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

Una función simple podría permitirle tirar basura a los archivos moviéndolos a la carpeta .Trash del usuario:

trash() {
   mv $1 ~/.Trash
}
james.kobol
fuente
? ¿Por qué un voto negativo? este sería mi pensamiento también ..
CousinCocaine
Probablemente necesites en $*lugar de $1, pero terminarías con la misma respuesta que mv "$@" ~/.Trash. Por qué la gente vota negativamente, revisa los comentarios de la otra respuesta.
kenorb
Ten cuidado con este alias; esto funciona si solo tiene una partición o unidad. Si está trabajando en un segundo volumen o recurso compartido de red, esto realmente copiará el archivo a la papelera de su directorio de inicio, ¡lo cual probablemente no sea lo que quería hacer!
jmk