Comment déplacer des fichiers dans la corbeille en ligne de commande?

129

Je fais beaucoup de travail en terminal et j'ai aujourd'hui l'expérience de la dactylographie

rm fileInQuestion.txt

Avant de découvrir que j'avais réellement besoin de fileInQuestion.txt. Si j'avais effacé l'interface graphique, je l'aurais simplement extraite de la corbeille. J'aimerais savoir s'il est possible de surcharger "rm" dans le terminal de manière à ce qu'il envoie le ou les fichiers dans la corbeille lors de leur sortie.

Joe
la source
1
Certains programmes peuvent récupérer des fichiers supprimés (tant que ces secteurs du disque dur ne sont pas écrasés entre-temps!). Dans ce cas, vous devriez utiliser l'un de ces ...
iconoclast
Consultez également le site askubuntu.com/q/468721/250556 pour les utilisateurs de googleurs à la recherche de fichiers trash Ubuntu / debian / linux.
ThorSummoner

Réponses:

100

Je ne conseillerais pas aliasing rmà mvque vous pourriez prendre l'habitude de rmne pas supprimer définitivement des fichiers, puis rencontrer des problèmes sur d' autres ordinateurs ou sous d' autres comptes utilisateur quand il ne supprime définitivement.

J'ai écrit un ensemble de bashscripts qui ajoutent plus de Mac OS outils de ligne de commande X-like (en plus d'un certain nombre de ceux intégrés comme open, pbcopy, pbpaste, etc.), le plus important trash. Ma version de trashva faire tout ce que le pseudonyme rmne permet pas (et, espérons-le, rien de mauvais, mais je l'utilise sur mon propre Mac depuis quelques années maintenant sans perte de données), notamment: renommer le fichier comme le fait le Finder si un fichier portant le même nom existe déjà, placez les fichiers dans le dossier Corbeille approprié sur les volumes externes; il a aussi quelques subtilités supplémentaires, comme par exemple: il essaie d'utiliser AppleScript lorsqu'il est disponible afin que vous obteniez le bon son de corbeille, etc. (mais ne l'exige pas, vous pouvez toujours l'utiliser via SSH quand aucun utilisateur n'est connecté), vous donner la taille de la corbeille à travers tous les volumes.

Vous pouvez récupérer ma suite tools-osx sur mon site ou la dernière et meilleure version du référentiel GitHub .

Il existe également une trashcommande développée par Ali Rantakari , mais je ne l’ai pas testée moi-même.

morgant
la source
4
Excellente réponse, bien meilleure que la mienne!
user1256923
24
Cela trashfait un moment que je me sers de Rantakari et je peux vraiment en témoigner. Il est compilé avec Objective-C et utilise intelligemment les API de système de fichiers standard et, en cas d'échec (l'utilisateur ne disposant pas de droits suffisants), il appelle le Finder pour supprimer les fichiers (en invoquant l'authentification). Vous pouvez lire plus d'informations trashsur hasseg.org/blog .
Jari Keinänen
26
la corbeille est également disponible via le gestionnaire de paquets de bière. il suffit d' utiliser: brew install trash.
Landon Kuhn
8
@ landon9720 Bon point. Et, pour clarifier pour les autres, la trashcommande disponible via Homebrew est celle d’Alai Rantakari (voir la brewformule ).
Morgant
3
J'ai pu réparer l'erreur en exécutant brew remove trashpuis brew install trash.
Elias Zamaria
99

L’ outil de ligne de commande de la corbeille peut être installé via brew install trash.

Il vous permet de restaurer des fichiers supprimés via une ligne de commande ou le Finder.

Paul Wenzel
la source
2
Quelle solution élégante!
M. Pei
6
Aussi disponible dans macports:port install trash
holocronweaver
à chaque fois que j'essaie brew install trash, je reçois ceci: pastebin.com/N92cM7d8
Ben Leggiero
@ BenC.R.Leggiero J'emporterais cette question à github.com/ali-rantakari/trash/issues . Avez-vous d' brew updateabord? Fonctionne bien sur ma fin.
Paul Wenzel
@ PaulWenzel oui, et il semble mettre à jour très bien. Je vais poster un numéro.
Ben Leggiero
21

J'ai un exécutable appelé remquelque part dans le mon $PATHavec le contenu suivant:

EDIT: le code ci-dessous est une version révisée et améliorée en collaboration avec 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

Il se comporte exactement de la même manière que la suppression du Finder. (Voir l'article du blog ici .)

Anthony Smith
la source
4
Cela devrait avoir plus de points à l’OMI. Comme c'est AppleScript, il utilise le processus de corbeille pour déplacer le fichier dans la corbeille, ce qui signifie qu'il se comportera exactement de la même façon. Dommage qu'un one-liner n'ait pas été fourni.
mxcl
2
Cette réponse est une leçon à tirer sur la manière de bien faire les choses. Cela fonctionne avec les jokers de shell et cela fonctionne à travers le Finder. Il ne réinvente aucune roue et est aussi simple que possible. Je l'ai mis dans mon ~/binnom, il l'a nommé trashet il a fonctionné pour la première fois, ce qui m'a permis de jeter beaucoup plus de fichiers de manière plus efficace que si je devais cliquer dessus dans la fenêtre du Finder. Beaucoup de gratitude. J'espère que vous posterez plus de réponses!
Ben Kovitz
3
Cette version gère les devis. Cela change un peu le comportement de gestion des erreurs, ce qui dans la version précédente ne semble pas être très soigneusement élaboré (erreurs sur stdout au lieu de stderr, pas de code de sortie), mais l'erreur que vous obtenez osascriptlorsque le fichier n'existe pas n’est pas beau, vous voudrez peut-être accorder cette partie.
Dave Abrahams
3
Bon travail. Cette version intègre ces modifications et (1) tente d'imiter rmautant que possible la commande shell en termes d'affichage de messages lorsque les fichiers n'existent pas, et (2) rassemble le tout en un seul osascriptappel.
Anthony Smith
3
One- uping
Dave Abrahams le
4

J'ai trouvé un joli code qui peut être ajouté à la fin du profil de traitement par lot de l'utilisateur et qui permet rmde déplacer les fichiers dans la corbeille à chaque exécution.

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
}

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

rraallvv
la source
2
C’est très intelligent, mais je ne le recommanderais toujours pas. C'est malin parce que c'est dans le profil bash pour l'utilisateur et que seul l'utilisateur peut donc exécuter cette version de la fonction en la tapant, les scripts qui s'appuient sur rm appellent toujours l'original. Mais je ne recommanderais pas cela car l’utilisateur s’habituera à réagir de la sorte alors que ce n’est pas le cas sur d’autres machines. Je vais l'utiliser, mais renommer la fonction "corbeille"
Matt Parkins le
J'utilise la même fonction avec deux modifications: J'ai corrigé un bogue dans la fonction qui renommait l'horodatage de tout dossier, s'il a été complété par une tabulation pour inclure une barre oblique de fin: Cela nécessite les modifications suivantes: ligne local dst=${path##*/}avec local dst=${mindtrailingslash##*/}et insérant une autre ligne juste avant celle qui dit local mindtrailingslash=${path%/}. ② J'utilise le nom function rr. Comme cela, cela n’interfère pas avec plain rm, mais le nom est pareillement court et rapide à taper (tout autre nom ferait l'affaire).
mars
Modifiez le nom de rm()en rmt()- De cette façon, vous pouvez toujours utiliser la rmcommande quand vous le souhaitez. Je pense à rmt dans ma tête comme remove to trash: D
James111
4

Utilisez la commande de terminal osascript, l'interpréteur AppleScript.

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

Ceci dit à AppleScript de dire au Finder d’envoyer le fichier à la corbeille.

PWD est nécessaire pour les chemins de fichiers relatifs, car AppleScript ne le gère pas bien.

cde
la source
1
Simple, efficace et sans rien installer! Agréable.
SilverWolf
2

une approche moderne en utilisant rapide

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
la source
1
Bien que ce lien puisse répondre à la question, il est préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien à titre de référence. Les réponses avec lien uniquement peuvent devenir non valides si la page liée est modifiée.
Jherran
@jherran merci pour le rappel, j'ai ajouté un segment de code
slf
C'est ma réponse préférée car elle utilise la même logique sous-jacente et les mêmes API que l'interface graphique.
Jason R. Coombs
1
Maintenant, si seulement une version Python évitait le recours à un binaire de 3 Mo pour effectuer un seul appel système.
Jason R. Coombs
1

Bien qu'il soit possible de rmdéplacer des fichiers vers la Corbeille au lieu de les supprimer, il est toutefois déconseillé de placer l'état d'esprit du filet de sécurité des interfaces utilisateur graphiques dans le shell UNIX. Il existe de nombreuses façons d’endommager sérieusement le terminal. Le meilleur conseil à mon humble avis est simplement de réfléchir à deux fois avant de frapper la enterclé dans une fenêtre shell.

Si vous souhaitez vous rmrappeler que vous êtes sur le point de supprimer un fichier, utilisez l’alias suivant (pour /bin/bashinsérer cette ligne .bashrcdans votre répertoire personnel):

alias rm "rm -i"

Cela fera la rmdemande confirmation avant d'essayer de supprimer chaque fichier.

Si vous avez TimeMachine en cours d'exécution (j'espère bien!), Vous pouvez toujours obtenir votre fichier à partir de la sauvegarde. De cette façon, vous pouvez perdre au plus une heure de travail. Ce qui est déjà assez grave, bien sûr. Alors réfléchis encore avant d'appuyer sur cette entertouche!

Mackie Messer
la source
1
Ne le fais pas! Les scripts d'installation peuvent utiliser rmet bloquer avec l'alias rm -i.
Old Pro
3
@OldPro: .bashrcn'est exécuté que si le shell est interactif. Consultez la page de manuel !
Mackie Messer
Je vous déconseille de retirer les filets de sécurité ou d'encourager les autres à le faire.
06
Je vais aller contre les opposants et dire que j'utilise cette astuce avec un grand effet, mais cela ne devrait certainement être fait qu'en connaissant les pièges. Deux cas non mentionnés sont que cela entraîne votre cerveau qui rmest plus en sécurité que ce qui vous mettra en difficulté sur d'autres systèmes. En outre, si vous utilisez -f, -iest complètement ignoré. Cela dit, c'est un bon filet de sécurité. Un meilleur est de ne jamais utiliser rmen faveur d'un rmialias ( alias rmi="rm -i") ou de l'excellent trashutilitaire. En outre, j'ajouterai que tout le monde aurait dû mettre [ -f ~/.bashrc ] && source ~/.bashrcleur .bash_profilemaintenant.
mattmc3
1

Homebrew permet d' installer deux utilitaires :

  1. poubelle

    Il s'agit d'un petit programme en ligne de commande pour OS X qui déplace des fichiers ou des dossiers dans la corbeille. L'USP de cette commande permet de restaurer facilement les fichiers. Une commande pour supprimer des fichiers / dossiers est inutile si vous ne pouvez pas restaurer des fichiers / dossiers après les avoir supprimés. Sur le site de la commande:

Par défaut, la corbeille demande au Finder de déplacer les fichiers / dossiers spécifiés vers la corbeille au lieu d'appeler l'API système à cette fin, en raison de la fonctionnalité "remettre en place" qui fonctionne uniquement lors de la suppression de fichiers via le Finder.


-F

Demandez au Finder de déplacer les fichiers dans la corbeille au lieu d'utiliser l'API du système. C'est plus lent, mais il utilise l'interface utilisateur du Finder (par exemple, les sons) et garantit le fonctionnement de la fonction "remettre en place".

-l

Liste des éléments actuellement dans la corbeille. Si cet argument est utilisé, aucun fichier ne doit être spécifié.

-e

Vider la poubelle. La corbeille demande une confirmation avant d'exécuter cette action. Si cet argument est utilisé, aucun fichier ne doit être spécifié.

Pour installer, trashexécutez ce qui suit dans Terminal:

brew install trash.


  1. rmtrash

    Un outil de ligne de commande qui déplace les fichiers dans la corbeille. Depuis la page de manuel de la commande:

Cette commande déplace les fichiers dans la corbeille plutôt que de les supprimer totalement du système de fichiers. Très utile si vous décidez que vous voulez ce fichier après tout ...


-u USERNAME

un argument optionnel. Cela déplacera le fichier dans la corbeille de l'utilisateur spécifié. Notez que vous avez besoin de privilèges suffisants pour accomplir cela.

Pour installer, rmtrashexécutez ce qui suit dans Terminal:

brew install rmtrash.

Nimesh Neema
la source
1

Voici une solution simple et triviale à ajouter à votre profil bash. Notez que cela écrasera déjà quelque chose du même nom dans la corbeille.

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

Usage:

 ~/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
la source
ont édité en conséquence - merci pour l'entrée!
Ryan Tuck
0

Trashing correctement (afin qu'il soit définitivement récupérable) est plus délicat que simplement un mvà ~/.Trash.

osx-trash est peut-être ce que vous cherchez. ( Caveat emptor - Je ne l'ai pas essayé et je ne peux pas en garantir le degré de sécurité.)

Rien
la source
0

Consultez trash-cli. Il fonctionne sur plusieurs plates-formes, ne produit aucun son de poubelle et prend en charge la récupération.

Vous pouvez l'installer avec (nécessite Node.js ) :

$ npm install --global trash-cli

Si vous ne souhaitez pas utiliser Node.js, vous pouvez également installer le binaire natif osx-trashmanuellement.

Sindre Sorhus
la source
-1

Dans votre .bashrc (ou partout où vous gardez les paramètres de votre shell), essayez d’ajouter un alias modifiant le comportement de rm pour déplacer des éléments vers ~ / .Trash, comme dans:

alias rm='move/to/.Trash'

Cet alias est loin d'être trivial à mettre en œuvre (du moins pour moi), car l'utilisation de mv (le candidat idéal à utiliser pour ce travail) est

mv file where

donc, avoir un alias qui place la partie 'où' devant le fichier à déplacer peut être assez sommaire. J'examinerai peut-être un conseil plus substantiel.

EDIT: J'ai juste essayé d'ajouter ce qui suit à mon .bashrc, et ça marche:

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

C'est beaucoup plus primitif que d'autres suggestions, mais vous évitez d'installer de nouvelles choses.

utilisateur1256923
la source
3
Les pseudonymes rmsont dangereux car ils peuvent endommager les scripts du programme d'installation. J'ai appris cela à la dure lorsque j'ai opté rmpour un alias rm -iet que des installations étaient bloquées.
Vieux Pro
@ Old Pro, c'est l'alias que j'utilise pour rm sur tous mes ordinateurs, à partir du jour 0, et je n'ai jamais eu de problèmes à cause de cela. Envie de donner un exemple?
user1256923
3
@OldPro: .bashrcn'est utilisé que pour les shells interactifs . Si vous exécutez ./install.shun nouveau processus est démarré et l'alias ne sera pas actif. Cependant, si vous exécutez . install.shvotre processus actuel exécutera le programme d'installation et que l'alias sera actif. RTFM ...
Mackie Messer
3
Ensuite, l’installateur exécutait un shell interactif et était donc sérieusement endommagé. Un installateur en panne est à peine une raison suffisante pour déconseiller les alias de shell en général. YMMV
Mackie Messer
1
Cependant, il est bon de ne pas rmaliaser la commande, comme le dit morgant, car vous ne voudrez rmplus vraiment supprimer des fichiers et vous risquez alors de supprimer accidentellement quelque chose sur un système où aucun alias n'a été ajouté. De plus, déplacer un fichier dans la corbeille n’est pas aussi simple que cela mv {} ~/.Trash. Si le fichier se trouve sur un volume séparé, par exemple, le fichier sera copié dans votre répertoire personnel et l'original sera supprimé.
Josh
-1

J'ai simplement mis ce 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

dans ~/bin/trash, fait le excutable chmod +x ~/bin/trash, et a ajouté la ligne suivante à~/.bash_profile

PATH=$PATH:$HOME/bin

Ensuite, on peut l'utiliser comme

$ trash broken.js olddir cleanup.*
JP
la source
-2

Une simple fonction pourrait vous permettre de supprimer des fichiers en les déplaçant vers le dossier .Trash de l'utilisateur:

trash() {
   mv $1 ~/.Trash
}
james.kobol
la source
? pourquoi un vote négatif? ce serait aussi ma pensée ..
CousinCocaine
Vous aurez probablement besoin $*au lieu de $1, mais vous auriez alors la même réponse que mv "$@" ~/.Trash. Pourquoi les gens votent-ils négativement, vérifiez les commentaires de l'autre réponse.
Kenorb
Soyez prudent avec cet alias; Cela fonctionne si vous n'avez qu'une seule partition ou un seul lecteur. Si vous travaillez sur un deuxième volume ou un partage réseau, le fichier sera copié dans la corbeille de votre répertoire personnel, ce qui n'est probablement pas ce que vous vouliez faire!
jmk