Come spostare i file nel cestino dalla riga di comando?


129

Faccio molto lavoro terminale e oggi ho avuto l'esperienza di scrivere

rm fileInQuestion.txt

Prima di scoprire che avevo effettivamente bisogno di fileInQuestion.txt. Se avessi eliminato nella GUI, l'avrei appena estratto dal Cestino. Vorrei sapere se è possibile sovraccaricare "rm" nel Terminale in modo tale da inviare il file / i file nel Cestino all'uscita.


1
Esistono programmi in grado di recuperare file cancellati (purché quei settori sul disco rigido non vengano sovrascritti nel frattempo!). Quando ciò accade, dovresti usare uno di quelli ...
iconoclast

Vedi anche askubuntu.com/q/468721/250556 per i googler che cercano il trashing di file ubuntu / debian / linux.
ThorSummoner,

Risposte:


100

Non consiglierei aliasing rma mvcome si potrebbe ottenere l'abitudine di rmfile non eliminazione in modo permanente e quindi incorrere in problemi su altri computer o sotto altri account utente quando si fa in modo permanente eliminare.

Ho scritto una serie di bashscript che aggiungono ulteriori strumenti X-simile della riga di comando di Mac OS (oltre a un certo numero di quelle built-in come open, pbcopy, pbpaste, ecc), la cosa più importante trash. La mia versione di trashfarà tutte le cose corrette che l'aliasing rmnon farà (e si spera niente di male, ma lo sto usando sul mio Mac da qualche anno senza dati persi), tra cui: rinominare il file come fa Finder se esiste già un file con lo stesso nome, inserendo i file nella cartella Cestino corretta su volumi esterni; ha anche alcune bellezze aggiunte, come: tenta di usare AppleScript quando disponibile in modo da ottenere il bel suono spazzatura e simili (ma non lo richiede in modo da poterlo ancora usare tramite SSH quando nessun utente è connesso), può ti dà la dimensione del cestino su tutti i volumi.

Puoi prendere la mia suite tools-osx dal mio sito o l'ultima e la più grande versione dal repository GitHub .

C'è anche un trashcomando sviluppato da Ali Rantakari , ma non l'ho testato da solo.


4
Ottima risposta, molto meglio della mia!
user1256923

24
Ho usato trashRantakari per un bel po 'e posso davvero garantirlo. È compilato Objective-C e utilizza abilmente le API del filesystem standard e, in caso di errore (ad es. L'utente non ha diritti sufficienti), chiama Finder per eliminare i file (richiedendo effettivamente l'autenticazione). Puoi leggere maggiori informazioni trashda hasseg.org/blog .
Jari Keinänen,

26
cestino è disponibile anche tramite il gestore pacchetti brew. basta usare: brew install trash.
Landon Kuhn,

8
@ landon9720 Un buon punto. E, per chiarire gli altri, il trashcomando disponibile tramite Homebrew è quello di Alai Rantakari (vedi la brewformula ).
perdente

3
Sono stato in grado di correggere l'errore eseguendo brew remove trashe quindi brew install trash.
Elias Zamaria,

99

Lo strumento da riga di comando cestino può essere installato tramite brew install trash.

Ti consente di ripristinare i file nel cestino tramite la riga di comando o il Finder.


2
Che soluzione elegante!
Mr. Pei,

6
Disponibile anche nei macports:port install trash
holocronweaver

ogni volta che provo brew install trash, ottengo questo: pastebin.com/N92cM7d8
Ben Leggiero

@ BenC.R.Leggiero Vorrei portare il problema su github.com/ali-rantakari/trash/issues . brew updatePrima tu ? Funziona bene da parte mia.
Paul Wenzel,

@PaulWenzel sì, e sembra aggiornarsi bene. Pubblicherò un problema.
Ben Leggiero,

21

Ho un eseguibile chiamato remda qualche parte nel mio $PATHcon i seguenti contenuti:

EDIT: il codice seguente è una versione rivista e migliorata in collaborazione 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

Si comporta esattamente come l'eliminazione dal Finder. (Vedi il post sul blog qui .)


4
Questo dovrebbe avere più punti IMO. Poiché è AppleScript, utilizza l'effettivo processo cestino per spostare il file nel cestino, il che significa che si comporterà esattamente allo stesso modo. Peccato che non sia stato fornito un liner.
mxcl

2
Questa risposta è una lezione oggettiva su come fare le cose nel modo giusto. Funziona con i caratteri jolly della shell e funziona tramite il Finder. Non reinventa alcuna ruota ed è il più semplice possibile. L'ho inserito nel mio ~/bin, l' ho chiamato trashe ha funzionato per la prima volta, permettendomi di eliminare un sacco di file in modo molto più efficiente che se dovessi fare clic su di essi nelle finestre del Finder. Molta gratitudine. Spero che pubblichi più risposte!
Ben Kovitz,

3
Questa versione gestisce le virgolette. Cambia un po 'il comportamento di gestione degli errori, che nella versione precedente sembra non essere stato elaborato con molta attenzione (errori su stdout invece di stderr, nessun codice di uscita) ma l'errore che si ottiene osascriptquando il file non esiste non è bello, quindi potresti voler mettere a punto quella parte.
Dave Abrahams,

3
Bel lavoro. Questa versione incorpora tali modifiche e anche (1) tenta di imitare il rmpiù possibile il comando shell in termini di visualizzazione dei messaggi quando i file non esistono e (2) raccoglie tutto in una singola osascriptchiamata.
Anthony Smith,


4

Ho trovato un codice abbastanza carino che può essere aggiunto alla fine del profilo batch dell'utente e fa rmspostare i file nel cestino ogni volta che viene eseguito.

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
}

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


2
Questo è molto intelligente ma ancora non lo consiglierei. È intelligente perché si trova nel profilo bash per l'utente e quindi solo l'utente può eseguire questa versione della funzione digitandola, gli script che si basano su rm chiameranno comunque l'originale. Ma non consiglierei di farlo perché l'utente si abituerà a recitare in questo modo quando non lo fa su altre macchine. Lo userò ma rinominerò la funzione "cestino"
Matt Parkins,

Sto usando la stessa funzione con due modifiche: ① Ho corretto un bug nella funzione che fa rinominare qualsiasi cartella nel timestamp, se è stata completata con un tab per includere una barra finale: Ciò richiede le seguenti modifiche: Sostituire il linea local dst=${path##*/}con local dst=${mindtrailingslash##*/}e inserendo un'altra linea appena prima di quella che dice local mindtrailingslash=${path%/}. ② Uso il nome function rr. In questo modo, non interferisce con il semplice rm, ma il nome è altrettanto breve e veloce da digitare (qualsiasi altro nome farebbe).
mach,

Cambia il nome di rm()in rmt()- In questo modo puoi ancora usare il rmcomando quando vuoi. Penso a RM nella mia testa come remove to trash: D
James111

4

Utilizzare il comando terminale osascript, l'interprete AppleScript.

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

Questo dice ad AppleScript di dire a Finder di inviare il file nel cestino.

PWD è necessario per i percorsi di file relativi, poiché AppleScript non gestisce così bene.


1
Semplice, efficace e non è necessario installare nulla! Bello.
SilverWolf il

2

un approccio 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)
}

1
Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
jherran

@jherran grazie per il promemoria, ho aggiunto un segmento di codice
slf

Questa è la mia risposta preferita perché utilizza la stessa logica e le API sottostanti della GUI.
Jason R. Coombs,

1
Ora, se solo ci fosse una versione di Python che evitava la necessità di un binario da 3 MB per effettuare una chiamata di sistema.
Jason R. Coombs,

1

Sebbene sia possibile rmspostare i file nel Cestino anziché rimuoverli, vorrei sconsigliare di portare la mentalità della rete di sicurezza delle interfacce grafiche dell'utente sulla shell UNIX. Esistono molti modi per arrecare gravi danni utilizzando il terminale. Il miglior consiglio di IMHO è semplicemente di pensarci due volte prima di premere la enterchiave in una finestra shell.

Se vuoi rmricordare che stai per eliminare un file, considera l'utilizzo del seguente alias (per /bin/bashinserire questa riga .bashrcnella tua home directory):

alias rm "rm -i"

Ciò consentirà la rmconferma della richiesta prima di tentare di rimuovere ciascun file.

Se hai TimeMachine in esecuzione (lo spero!) Puoi sempre ottenere il tuo file dal backup. In questo modo puoi perdere al massimo un'ora di lavoro. Il che è abbastanza male, ovviamente. Quindi ripensaci prima di premere quel entertasto!


1
Non farlo! Gli script del programma di installazione possono utilizzare rme bloccarsi con l'alias rm -i.
Old Pro

3
@OldPro: .bashrcviene eseguito solo se la shell è interattiva. Controlla la pagina man !
Mackie Messer,

consiglierei di non rimuovere le reti di sicurezza o di ammonire gli altri a farlo.
altro

Andrò contro gli oppositori e dirò che uso questo trucco con grande efficacia, ma sicuramente dovrebbe essere fatto solo conoscendo le insidie. Due non menzionati sono che allena il tuo cervello che rmè più sicuro di quello che ti metterà nei guai su altri sistemi. Inoltre, se lo usi -f, -iviene completamente ignorato. Detto questo, questa è una buona rete di sicurezza. Uno migliore è non usare mai rma favore di un rmialias ( alias rmi="rm -i") o trashdell'utilità eccellente . Inoltre, io aggiungo che tutti dovrebbero hanno messo [ -f ~/.bashrc ] && source ~/.bashrcnella loro .bash_profileormai.
mattmc3,

1

Esistono due utility installabili tramite Homebrew che possono ottenere questo risultato:

  1. spazzatura

    Questo è un piccolo programma da riga di comando per OS X che sposta i file o le cartelle nel cestino. L'USP di questo comando è che consente di ripristinare facilmente i file. Un comando per eliminare file / cartelle è inutile se non è possibile ripristinare file / cartelle dopo averli eliminati. Dal sito Web del comando:

Per impostazione predefinita, cestino chiede a Finder di spostare i file / le cartelle specificati nel cestino invece di chiamare l'API di sistema per farlo a causa della funzione "rimessa" che funziona solo quando si esegue il cestino dei file tramite Finder.


-F

Chiedi a Finder di spostare i file nel cestino, invece di utilizzare l'API di sistema. Questo è più lento, ma utilizza l'interfaccia utente del Finder (ad es. Suoni) e garantisce che la funzione "rimessa in funzione" funzioni.

-l

Elenca gli elementi attualmente nel cestino. Se si utilizza questo argomento, non è necessario specificare alcun file.

-e

Svuota il cestino. cestino chiede conferma prima di eseguire questa azione. Se si utilizza questo argomento, non è necessario specificare alcun file.

Per installare trasheseguire quanto segue nel Terminale:

brew install trash.


  1. rmtrash

    Uno strumento da riga di comando che sposta i file nel cestino. Dalla pagina man del comando:

Questo comando sposta i file nel cestino anziché rimuoverli totalmente dal file system. Molto utile se decidi di voler quel file dopo tutto ...


-u USERNAME

un argomento facoltativo. Questo sposterà il file nel cestino dell'utente specificato. Si noti che sono necessari privilegi sufficienti per raggiungere questo obiettivo.

Per installare rmtrasheseguire quanto segue nel Terminale:

brew install rmtrash.


1

Ecco una soluzione di una riga piuttosto banale da aggiungere al tuo profilo bash. Nota che sovrascriverà già qualcosa con lo stesso nome nel cestino.

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 $$$

ho modificato di conseguenza - grazie per l'input!
Ryan Tuck,

0

Cestinare correttamente le cose (in modo che sia sicuramente recuperabile) è più complicato di un semplice da mvfare ~/.Trash.

osx-trash potrebbe essere quello che stai cercando. ( Caveat emptor : non l'ho provato e non posso garantire la sua sicurezza.)


0

Partenza trash-cli. Funziona su più piattaforme, senza audio spazzatura e supporta Put Back.

Puoi installarlo con (richiede Node.js ) :

$ npm install --global trash-cli

In alternativa, se non si desidera utilizzare Node.js, è possibile installare osx-trashmanualmente il file binario nativo .


-1

Nel tuo .bashrc (o ovunque mantieni i parametri per la tua shell), prova ad aggiungere un alias che cambi il comportamento di rm nello spostamento di cose in ~ / .Trash, come in:

alias rm='move/to/.Trash'

Questo alias è tutt'altro che banale da implementare (almeno per me), perché l'uso di mv (il primo candidato da utilizzare per questo lavoro) è

mv file where

quindi avere un alias che mette la parte 'dove' davanti al file da spostare potrebbe essere piuttosto imprecisa. Lo esaminerò e potrei ottenere consigli più sostanziali.

EDIT: Ho appena provato ad aggiungere quanto segue al mio .bashrc, e funziona:

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

È molto più primitivo rispetto ad altri suggerimenti, ma eviti di installare nuove cose.


3
L'aliasing rmsu qualsiasi cosa è pericoloso perché potrebbe interrompere gli script di installazione. Ho imparato questo nel modo più duro quando ho alias rmper rm -ie aveva installazioni appendere.
Old Pro

@ Old Pro, questo è l'alias che uso per rm in tutti i miei computer, dal giorno 0, e non ho mai avuto problemi a causa di ciò. Ti va di fare un esempio?
user1256923

3
@OldPro: .bashrcviene utilizzato solo per shell interattive . Se si esegue ./install.shun nuovo processo, viene avviato e l'alias non sarà attivo. Tuttavia, se si esegue . install.shil processo corrente verrà eseguito il programma di installazione e l'alias è attivo. RTFM ...
Mackie Messer,

3
Quindi il programma di installazione stava eseguendo una shell interattiva e quindi era seriamente rotto. Un programma di installazione non funzionante è una ragione sufficiente per sconsigliare gli alias di shell in generale. YMMV
Mackie Messer

1
Tuttavia, è consigliabile non alias il rmcomando, come ha detto morgant, perché ti sentirai a tuo agio nel rmnon rimuovere effettivamente i file e quindi potresti accidentalmente eliminare qualcosa su un sistema in cui tale alias non è stato aggiunto. Inoltre, spostare un file nel cestino non è semplice come solo mv {} ~/.Trash. Se il file si trova su un volume separato, ad esempio, questo copierà il file nella directory home e cancellerà l'originale.
Josh,

-1

Ho semplicemente messo questo 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 ha reso stimabile chmod +x ~/bin/trashe ha aggiunto la seguente riga a~/.bash_profile

PATH=$PATH:$HOME/bin

Quindi si può usare come

$ trash broken.js olddir cleanup.*

-2

Una semplice funzione potrebbe consentire di eliminare i file spostandoli nella cartella .Trash dell'utente:

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

? perché un voto negativo? questo sarebbe anche il mio pensiero ..
CousinCocaine

Probabilmente hai bisogno $*invece di $1, ma poi finiresti con la stessa risposta di mv "$@" ~/.Trash. Perché le persone lo votano negativamente, controlla i commenti dell'altra risposta.
Kenorb,

Stai attento con questo alias; funziona se hai una sola partizione o unità. Se stai lavorando su un secondo volume o condivisione di rete, questo in realtà copierà il file nel cestino della tua home directory, che probabilmente non è quello che volevi fare!
jmk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.