Como mover arquivos para a lixeira na linha de comando?


129

Eu faço muito trabalho terminal e hoje tive a experiência de digitar

rm fileInQuestion.txt

Antes de descobrir que eu realmente precisava do fileInQuestion.txt. Se eu tivesse excluído a GUI, teria tirado do lixo. Gostaria de saber se é possível sobrecarregar 'rm' no Terminal de forma que ele envie os arquivos para a Lixeira na saída.


1
Existem programas que podem recuperar arquivos excluídos (desde que os setores no disco rígido não sejam substituídos nesse meio tempo!). Quando isso acontece, você deve usar um daqueles ...
iconoclasta

Consulte também askubuntu.com/q/468721/250556 para googlers que procuram lixo no arquivo ubuntu / debian / linux.
ThorSummoner

Respostas:


100

Eu não aconselharia aliasing rmpara mvque você pode adquirir o hábito de rmarquivos não apagar de forma permanente e, em seguida, executar em problemas em outros computadores ou sob outras contas de usuário quando ele não excluir permanentemente.

Eu escrevi um conjunto de bashscripts que adicionar mais ferramentas X-like linha de comando do Mac OS (para além de uma série dos internos como open, pbcopy, pbpaste, etc.), o mais importante trash. Minha versão trashfará todas as coisas corretas que o aliasing rmnão fará (e espero que nada de ruim, mas eu as uso em meus próprios Macs há alguns anos sem dados perdidos), incluindo: renomear o arquivo como o Finder faz se um arquivo com o mesmo nome já existir, coloque os arquivos na pasta Lixeira correta em volumes externos; ele também possui algumas características adicionais, como: tenta usar o AppleScript quando disponível, para que você tenha um som agradável do lixo e tal (mas não o exige, para que você ainda possa usá-lo via SSH quando nenhum usuário estiver logado); dê a você o tamanho da lixeira em todos os volumes.

Você pode pegar meu pacote tools-osx do meu site ou a versão mais recente e melhor do repositório GitHub .

Há também um trashcomando desenvolvido por Ali Rantakari , mas eu mesmo não testei.


4
Excelente resposta, muito melhor que a minha!
User1256923

24
Eu uso o trashRantakari há um bom tempo e posso realmente atestar isso. Ele é compilado como Objective-C e usa APIs padrão do sistema de arquivos e, se falhar (por exemplo, o usuário não possui direitos suficientes), chama o Finder para lixeira dos arquivos (solicitando efetivamente a autenticação). Você pode ler mais informações trashem hasseg.org/blog .
Jari Keinänen

26
o lixo também está disponível no gerenciador de pacotes de distribuição. basta usar: brew install trash.
Landon Kuhn

8
@ landon9720 Bom ponto. E, para esclarecer para outras pessoas, o trashcomando disponível no Homebrew é de Alai Rantakari (veja a brewfórmula ).
Morgant

3
Consegui corrigir o erro executando brew remove trashe depois brew install trash.
Elias Zamaria

99

A ferramenta de linha de comando da lixeira pode ser instalada via brew install trash.

Ele permite restaurar arquivos lixeira através da linha de comando ou do Finder.


2
Que solução elegante!
Sr. Pei

6
Também disponível no macports:port install trash
holocronweaver

toda vez que tento brew install trash, recebo o seguinte: pastebin.com/N92cM7d8
Ben Leggiero 30/10/2015

@ BenC.R.Leggiero Gostaria de levar essa questão para github.com/ali-rantakari/trash/issues . Você brew updateprimeiro? Funciona bem do meu lado.
Paul Wenzel

@PaulWenzel sim, e parece atualizar muito bem. Vou postar um problema.
Ben leggiero

21

Eu tenho um executável chamado remem algum lugar no meu $PATHcom o seguinte conteúdo:

EDIT: o código abaixo é uma versão revisada e aprimorada em colaboração com 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

Ele se comporta exatamente da mesma maneira que a exclusão do Finder. (Veja a postagem do blog aqui .)


4
Isso deve ter mais pontos IMO. Por ser AppleScript, ele usa o processo de lixeira real para mover o arquivo para a lixeira, o que significa que ele se comportará exatamente da mesma maneira. Pena que um one-liner não foi fornecido no entanto.
Mxcl #

2
Esta resposta é uma lição objetiva de como fazer as coisas corretamente. Ele funciona com curingas de shell e funciona através do Finder. Não reinventa rodas, e é tão simples quanto possível. Coloquei-o no meu ~/bin, o nomeei trash, e funcionou na primeira vez - permitindo que eu lixeira muitos arquivos com muito mais eficiência do que se eu tivesse que clicar neles nas janelas do Finder. Muita gratidão. Espero que você publique mais respostas!
precisa

3
Esta versão lida com aspas. Ele altera um pouco o comportamento de manipulação de erros, que na versão acima parece não ter muito cuidado (erros no stdout em vez de stderr, sem código de saída), mas o erro osascriptocorre quando o arquivo não existe não é bonito, então você pode querer ajustar essa parte.
Dave Abrahams

3
Bom trabalho. Esta versão incorpora essas alterações e também (1) tenta imitar o rmmáximo possível o comando shell em termos de exibição de mensagens quando os arquivos não existem e (2) reúne tudo em uma única osascriptchamada.
Anthony Smith


4

Eu encontrei um código bastante agradável que pode ser adicionado ao final do perfil lote do usuário e faz rmmover os arquivos para o lixo cada vez que é executado.

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
Isso é inteligente, mas eu ainda não recomendaria isso. É inteligente porque está no perfil bash para o usuário e, portanto, apenas o usuário pode executar esta versão da função digitando-a, os scripts que dependem da rm ainda chamarão o original. Mas eu não recomendaria fazer isso porque o usuário se acostumará a agir dessa maneira quando não estiver em outras máquinas. Eu vou usar isso, mas mudar o nome da função de "lixo"
Matt Parkins

Estou usando a mesma função com duas alterações: ① Corrigi um bug na função que faz com que qualquer pasta seja renomeada para o carimbo de data / hora, se tiver sido preenchida por tabulação para incluir uma barra final: Isso requer as seguintes alterações: Substituindo o linha local dst=${path##*/}com local dst=${mindtrailingslash##*/}e inserir outra linha logo antes que um que diz local mindtrailingslash=${path%/}. Eu uso o nome function rr. Assim, ele não interfere com o simples rm, mas o nome é igualmente curto e rápido para digitar (qualquer outro nome faria).
mach

Alterar o nome de rm()para rmt()- Dessa forma, você ainda pode usar o rmcomando quando quiser. Penso rmt na minha cabeça como remove to trash: D
James111

4

Use o comando terminal osascript, o intérprete AppleScript.

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

Isso informa ao AppleScript para solicitar ao Finder que envie o arquivo para a lixeira.

O PWD é necessário para caminhos de arquivo relativos, pois o AppleScript não lida bem com isso.


1
Simples, eficaz e sem necessidade de instalar nada! Agradável.
SilverWolf

2

uma abordagem moderna usando rápida

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
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada.
jherran

@ jherran obrigado pelo lembrete, eu adicionei um segmento de código
slf

Esta é a minha resposta preferida, pois usa a mesma lógica subjacente e APIs da GUI.
Jason R. Coombs

1
Agora, se ao menos houvesse uma versão em Python que evitasse a necessidade de um binário de 3 MB para fazer uma chamada de sistema.
Jason R. Coombs

1

Embora seja possível fazer rmmover arquivos para o Lixo em vez de removê-los, eu recomendaria não trazer a mentalidade da rede de segurança das interfaces gráficas do usuário para o shell UNIX. Existem várias maneiras de causar danos graves usando o terminal. O melhor conselho ao IMHO é simplesmente pensar duas vezes antes de pressionar a entertecla em uma janela do shell.

Se você quiser rmlembrá-lo de que está prestes a excluir um arquivo, considere usar o seguinte alias (para /bin/bashcolocar esta linha no .bashrcdiretório inicial):

alias rm "rm -i"

Isso fará a rmconfirmação da solicitação antes de tentar remover cada arquivo.

Se você tiver o TimeMachine em execução (espero que sim!), Você sempre poderá obter seu arquivo de backup. Dessa forma, você pode perder no máximo uma hora de trabalho. O que já é ruim o suficiente, é claro. Então pense novamente antes de pressionar essa entertecla!


1
Não faça isso! Os scripts do instalador podem usar rme travar com o alias rm -i.
Old Pro

3
@ OldPro: .bashrcsó é executado se o shell for interativo. Verifique a página de manual !
Mackie Messer

eu desaconselharia a remoção de redes de segurança ou a advertência de outras pessoas.
the0ther

Eu vou contra os pessimistas e direi que uso esse truque com grande efeito, mas definitivamente só deve ser feito sabendo as armadilhas. Dois não mencionados são que ele treina seu cérebro de maneira rmmais segura do que é, o que causará problemas em outros sistemas. Além disso, se você usar -f, -iserá completamente ignorado. Dito isto, esta é uma boa rede de segurança. Um melhor é nunca usar a rmfavor de um rmialias ( alias rmi="rm -i") ou da excelente trashutilidade. Além disso, acrescentarei que todo mundo já deveria ter colocado o [ -f ~/.bashrc ] && source ~/.bashrcseu .bash_profileagora.
mattmc3

1

Existem dois utilitários instaláveis ​​via Homebrew que podem fazer isso:

  1. Lixo

    Este é um pequeno programa de linha de comando para o OS X que move arquivos ou pastas para a lixeira. A USP desse comando é que permite restaurar facilmente os arquivos. Um comando para lixeira de arquivos / pastas não será útil se você não puder restaurar arquivos / pastas após a lixeira. No site do comando:

Por padrão, a lixeira pede ao Finder que mova os arquivos / pastas especificados para a lixeira, em vez de chamar a API do sistema para fazer isso por causa do recurso "colocar de volta", que só funciona ao lixeira por meio do Finder.


-F

Peça ao Finder para mover os arquivos para a lixeira, em vez de usar a API do sistema. Isso é mais lento, mas utiliza a interface do usuário do Finder (por exemplo, sons) e garante que o recurso "adiar" funcione.

-eu

Listar itens atualmente no lixo. Se esse argumento for usado, nenhum arquivo precisará ser especificado.

-e

Esvazie a lixeira. lixo pede confirmação antes de executar esta ação. Se esse argumento for usado, nenhum arquivo precisará ser especificado.

Para instalar, trashexecute o seguinte no Terminal:

brew install trash.


  1. rmtrash

    Uma ferramenta de linha de comando que move arquivos para a lixeira. Na página do manual do comando:

Este comando move os arquivos para a lixeira em vez de removê-los totalmente do sistema de arquivos. Muito útil se você decidir que deseja esse arquivo, afinal ...


-u USERNAME

um argumento opcional. Isso moverá o arquivo para a lixeira do usuário especificado. Observe que você precisa de privilégios suficientes para fazer isso.

Para instalar, rmtrashexecute o seguinte no Terminal:

brew install rmtrash.


1

Aqui está uma solução de uma linha bastante trivial para adicionar ao seu perfil do bash. Observe que ele já substituirá algo com o mesmo nome na lixeira.

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

foram editados de acordo - obrigado pela contribuição!
Ryan Tuck

0

Corretamente destruindo coisas (de modo que é definitivamente recuperável) é mais complicado do que simplesmente um mvpara ~/.Trash.

osx-lixo pode ser o que você está procurando. ( Advertência - não tentei e não posso garantir a segurança.)


0

Confira trash-cli. Ele funciona em várias plataformas, sem som de lixo e suporta Put Back.

Você pode instalá-lo com (requer Node.js ) :

$ npm install --global trash-cli

Como alternativa, se você não quiser usar o Node.js, poderá instalar o binário nativo osx-trashmanualmente.


-1

No seu .bashrc (ou onde quer que você mantenha os parâmetros do seu shell), tente adicionar um alias que mude o comportamento do rm para mover coisas para ~ / .Trash, como em:

alias rm='move/to/.Trash'

Esse alias se está longe de ser trivial de implementar (pelo menos para mim), porque o uso do mv (o principal candidato a ser usado para este trabalho) é

mv file where

portanto, ter um alias que coloca a parte 'where' na frente do arquivo a ser movido pode ser bastante superficial. Vou investigar e obter conselhos mais substanciais.

Edição: Eu apenas tentei adicionar o seguinte ao meu .bashrc, e ele funciona:

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

É muito mais primitivo do que outras sugestões, mas você evita instalar coisas novas.


3
Aliasing rmpara qualquer coisa é perigoso porque pode quebrar os scripts do instalador. Eu aprendi isso da maneira mais difícil quando eu alias rmpara rm -ie tinha instalações pendurar.
Old Pro

@ Old Pro, esse é o alias que eu uso para a rm em todos os meus computadores, desde o dia 0, e nunca tive problemas por causa disso. Gostaria de dar um exemplo?
User1256923

3
@ OldPro: .bashrcé usado apenas para shells interativos . Se você executar, ./install.shum novo processo será iniciado e o alias não estará ativo. No entanto, se você executar . install.sho processo atual, o instalador será executado e o alias estará ativo. RTFM ...
Mackie Messer

3
Em seguida, o instalador estava executando um shell interativo e, portanto, foi seriamente quebrado. Um instalador quebrado não é motivo suficiente para desaconselhar aliases de shell em geral. YMMV
Mackie Messer

1
No entanto, é um bom conselho não rmalterar o nome do comando, como disse o morgante, porque você se sentirá confortável em rmnão remover os arquivos e poderá excluir acidentalmente algo em um sistema em que esse apelido não foi adicionado. Além disso, mover um arquivo para a lixeira não é tão simples quanto justo mv {} ~/.Trash. Se o arquivo estiver em um volume separado, por exemplo, ele copiará o arquivo para o diretório inicial e excluirá o original.
30513 Josh

-1

Eu simplesmente coloquei esse 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, tornado permutável chmod +x ~/bin/trashe adicionou a seguinte linha ao~/.bash_profile

PATH=$PATH:$HOME/bin

Então pode-se usá-lo como

$ trash broken.js olddir cleanup.*

-2

Uma função simples pode permitir que você lixeira arquivos, movendo-os para a pasta .Trash do usuário:

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

? por que um voto negativo? este seria o meu pensamento, bem ..
CousinCocaine

Você provavelmente precisa em $*vez de $1, mas então você terminaria com a mesma resposta que mv "$@" ~/.Trash. Por que as pessoas votam negativamente, verifique os comentários da outra resposta.
Kenorb # 6/15

Tenha cuidado com este alias; isso funciona se você tiver apenas uma partição ou unidade. Se você estiver trabalhando em um segundo volume ou compartilhamento de rede, isso copiará o arquivo para o lixo do diretório inicial, o que provavelmente não é o que você queria fazer!
jmk
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.