커맨드 라인에서 파일을 휴지통으로 옮기는 방법?


129

나는 많은 터미널 작업을하고 있으며 오늘은 타이핑 경험이있었습니다

rm fileInQuestion.txt

실제로 fileInQuestion.txt가 필요하다는 것을 알기 전에. GUI에서 삭제했다면 휴지통에서 가져 왔을 것입니다. 터미널에서 'rm'을 오버로드하여 파일 / 파일을 휴지통으로 보내는 방식으로 과부하가 가능한지 알고 싶습니다.


1
하드 드라이브의 해당 섹터를 그동안 덮어 쓰지 않는 한 삭제 된 파일을 복구 할 수있는 프로그램이 있습니다. 이런 일이 발생하면 그 중 하나를 사용해야합니다.
iconoclast

또한 ubuntu / debian / linux 파일 휴지통을 찾는 Google 직원askubuntu.com/q/468721/250556 을 참조하십시오 .
ThorSummoner

답변:


100

나는 앨리어싱을 조언하지 않을 rmmv당신의 습관을 하듯이 rm영구적으로 삭제하지 파일과 다음이 때 다른 컴퓨터 또는 다른 사용자 계정에서 문제로 실행 않습니다 영구적으로 삭제합니다.

나는 일련의 작성 bash(같은 내장 된 사람의 숫자 이외에 더 맥 OS X와 같은 명령 행 도구를 추가 스크립트 open, pbcopy, pbpaste가장 중요한 것은, 등) trash. 내 버전은 trash앨리어싱 rm이하지 않는 모든 올바른 작업을 수행하며 (아마도 나쁘지 않지만 데이터 손실없이 몇 년 동안 내 Mac에서 사용했습니다) Finder와 같은 파일 이름 바꾸기 동일한 이름의 파일이 이미 존재하는 경우 외부 볼륨의 올바른 휴지통에 파일을 넣습니다. 또한 다음과 같은 추가 기능이 있습니다. 사용 가능한 경우 AppleScript를 사용하여 멋진 휴지통 소리를 얻습니다 (그러나 사용자가 로그인하지 않은 경우 SSH를 통해 계속 사용할 수 있음). 모든 볼륨에서 휴지통 크기를 제공합니다.

내 사이트 또는 GitHub 리포지토리 에서 가장 최신 버전의 tools-osx 제품군을 가져올 수 있습니다 .

이 또한의 알리 Rantakari에 의해 개발 된 명령은 ,하지만 난 한 것을 자신을 테스트하지 않았습니다.trash


4
내 대답보다 훨씬 우수합니다!
user1256923 2016 년

24
나는 trashRantakari가 꽤 오랫동안 사용 했으며 실제로 그것을 보증 할 수 있습니다. Objective-C로 컴파일되고 표준 파일 시스템 API를 영리하게 사용하며, 실패 할 경우 (즉, 사용자에게 충분한 권한이없는 경우) 파인더를 호출하여 파일을 휴지통으로 보냅니다 (인증을 효과적으로 요청 함). hasseg.org/blogtrash 에서 더 많은 정보를 읽을 수 있습니다 .
Jari Keinänen

26
추출 패키지 관리자를 통해 휴지통을 이용할 수도 있습니다. 그냥 사용하십시오 : brew install trash.
Landon Kuhn

8
좋은 지적이다. 그리고 다른 사람들을 명확히하기 위해 Homebrew를trash 통해 사용 가능한 명령 은 Alai Rantakari 's입니다 ( 공식 참조 ). brew
morgant

3
나는 실행하여 오류를 수정할 수 있었다 brew remove trash다음과 brew install trash.
Elias Zamaria

99

쓰레기 명령 행 도구를 통해 설치 될 수 있습니다 brew install trash.

명령 줄이나 Finder를 통해 휴지통에있는 파일을 복원 할 수 있습니다.


2
정말 우아한 해결책입니다!
Mr. Pei

6
macports에서도 이용 가능 :port install trash
holocronweaver

내가하려고 할 때마다이 brew install trash: 나는이 얻을 pastebin.com/N92cM7d8
벤 Leggiero

@ BenC.R. Leggiero 나는 그 문제를 github.com/ali-rantakari/trash/issues가져갈 것 입니다. brew update먼저 했습니까 ? 내 말에 잘 작동합니다.
Paul Wenzel

@PaulWenzel 예, 잘 업데이트되는 것 같습니다. 문제를 게시하겠습니다.
Ben Leggiero

21

다음 내용을 가진 rem어딘가에 실행 파일이 $PATH있습니다.

편집 : 아래 코드는 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

Finder에서 삭제하는 것과 정확히 같은 방식으로 작동합니다. (블로그 게시물은 여기를 참조 하십시오 .)


4
더 많은 포인트 IMO가 있어야합니다. AppleScript이기 때문에 실제 휴지통 프로세스를 사용하여 파일을 휴지통으로 옮깁니다. 이는 정확히 동일하게 작동한다는 것을 의미합니다. 그러나 부끄러운 줄은 제공되지 않았습니다.
mxcl

2
이 답변은 올바른 일을하는 방법에 대한 객관적인 교훈입니다. 쉘 와일드 카드 함께 작동하며 Finder를 통해 작동합니다. 바퀴를 재발 명하지 않으며 가능한 한 간단합니다. 필자는 파일을에 넣고 ~/bin이름을 지정 trash했으며 처음으로 작동하여 Finder 윈도우에서 파일을 클릭하는 것보다 훨씬 많은 파일을 더 효율적으로 휴지통에 넣을 수 있었습니다. 감사합니다. 더 많은 답변을 게시하기를 바랍니다.
벤 코 비츠

3
이 버전 은 따옴표를 처리합니다. 그것은 오류 처리 동작을 약간 변경합니다. 위 버전에서는 매우 조심스럽게 해결되지 않은 것 같습니다 (stderr 대신 stdout 오류, 종료 코드 없음) osascript. 파일이 존재하지 않을 때 발생하는 오류 아름답 지 않기 때문에 그 부분을 조정하고 싶을 수도 있습니다.
Dave Abrahams

3
좋은 작업. 이 버전 에는 이러한 변경 사항 통합되어 있으며 (1) rm파일이 존재하지 않을 때 메시지를 표시하는 측면에서 가능한 한 많이 쉘 명령을 모방하려고 시도 하며 (2) 모든 것을 단일 osascript호출 로한데 모 읍니다 .
Anthony Smith


4

사용자의 배치 프로필 끝에 추가 할 수 있고 rm파일이 실행될 때마다 파일을 휴지통으로 이동 시키는 꽤 좋은 코드를 발견했습니다 .

나노 ~ / .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
}

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


2
이것은 v 영리하지만 여전히 권장하지는 않습니다. 그것은 사용자를위한 bash 프로파일에 있기 때문에 영리합니다. 따라서 사용자만이 버전의 함수를 입력하여 실행할 수 있습니다 .rm에 의존하는 스크립트는 여전히 원본을 호출합니다. 그러나 사용자가 다른 시스템에 있지 않을 때 이러한 방식으로 작동하는 데 익숙해지기 때문에이 작업을 수행하지 않는 것이 좋습니다. 이 기능을 사용하려고하지만 기능의 이름을 "trash"로 바꿉니다.
Matt Parkins

동일한 기능을 두 가지 변경으로 사용하고 있습니다. ① 끝에 슬래시를 포함하도록 탭 완성 된 폴더의 이름이 타임 스탬프로 바뀌는 기능의 버그를 수정했습니다. 다음과 같이 변경해야합니다. 라인 local dst=${path##*/}local dst=${mindtrailingslash##*/}그냥 말한다 일 전에 다른 라인을 삽입 local mindtrailingslash=${path%/}. ② 나는 이름을 사용한다 function rr. 이와 같이 plain rm과는 관련이 없지만 이름은 짧고 입력하기가 빠릅니다 (다른 이름은 가능).
mach

이름 변경 rm()rmt()여전히 사용할 수있는이 방법 - rm당신이 원하는 경우 명령을 사용합니다. I는 내 머리에 RMT 생각 remove to trashD :
James111

4

AppleScript 인터프리터 인 터미널 명령 osascript를 사용하십시오.

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

이것은 AppleScript에게 파인더에게 파일을 휴지통으로 보내도록 지시합니다.

AppleScript가 잘 처리하지 못하므로 상대 파일 경로에 PWD가 필요합니다.


1
간단하고 효과적이며 아무것도 설치할 필요가 없습니다! 좋은.
SilverWolf

2

스위프트를 이용한 현대적인 접근

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
이 링크가 질문에 대한 답변을 제공 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다.
jherran

@jherran 상기시켜 주셔서 감사합니다. 코드 세그먼트를 추가했습니다
slf

이것은 GUI와 동일한 기본 논리 및 API를 사용하기 때문에 선호되는 답변입니다.
Jason R. Coombs

1
이제 한 번의 시스템 호출을 위해 3MB 바이너리가 필요하지 않은 Python 버전 만 있다면.
Jason R. Coombs

1

rm파일을 제거하는 대신 휴지통으로 파일을 이동할 수는 있지만 그래픽 사용자 인터페이스의 안전망의 사고 방식을 UNIX 셸로 가져 오는 것을 권장하지 않습니다. 터미널을 사용하여 심각한 손상을 입히는 방법에는 여러 가지가 있습니다. IMHO에게 가장 좋은 조언 enter은 쉘 창에서 키를 누르기 전에 단순히 두 번 생각하는 것 입니다.

rm파일을 삭제 하려고 한다는 것을 상기 시키려면 다음 별명을 사용하는 것이 좋습니다 ( 홈 디렉토리 /bin/bash에이 행 을 넣는 경우 .bashrc).

alias rm "rm -i"

이 것 rm제거하기 전에 요청 확인을 파일을.

TimeMachine을 실행중인 경우 (그렇기를 바랍니다) 항상 백업에서 파일을 가져올 수 있습니다. 이 방법으로 최대 1 시간의 작업을 잃을 수 있습니다. 물론 나쁘다. 그 enter키 를 누르기 전에 다시 생각하십시오 !


1
하지마! 설치 스크립트는 rm별명을 사용 하고 정지 시킬 수 있습니다 rm -i.
Old Pro

3
@OldPro : .bashrc셸이 대화 형인 경우에만 실행됩니다. 매뉴얼 페이지를 확인 하십시오 !
Mackie Messer

나는 안전망을 제거하거나 다른 사람들에게 그렇게하도록 권고하지 말 것을 권합니다.
the0ther

나는 naysayers에 맞서서이 효과를 큰 효과를 위해 사용한다고 말할 것입니다. 그러나 함정을 아는 것만으로도 분명히 이루어져야합니다. 언급되지 않은 두 가지는 rm다른 시스템에서 문제를 일으킬 수있는 것보다 안전한 뇌를 훈련 시킨다는 것 입니다. 또한를 사용 -f하면 -i완전히 무시됩니다. 즉, 이것은 좋은 안전망입니다. 더 좋은 방법 rmrmi별칭 ( alias rmi="rm -i")이나 뛰어난 trash유틸리티 를 위해 사용하지 않는 것 입니다 . 또한 지금까지 모든 사람이 [ -f ~/.bashrc ] && source ~/.bashrc자신의 의견 .bash_profile을 제시해야한다고 덧붙 입니다 .
mattmc3

1

Homebrew 를 통해 설치 가능한 유틸리티는 두 가지 가 있습니다.

  1. 폐물

    파일이나 폴더를 휴지통으로 옮기는 OS X 용 작은 명령 줄 프로그램입니다. 이 명령의 USP는 파일을 쉽게 복원 할 수 있도록하는 것입니다. 파일 / 폴더를 휴지통에 버리기 명령은 파일 / 폴더를 휴지통에 넣은 후에 복원 할 수 없으면 사용되지 않습니다. 명령 웹 사이트에서 :

기본적으로 trash는 Finder를 통해 파일을 휴지통에 넣을 때만 작동하는 "뒤로"기능으로 인해 시스템 API를 호출하는 대신 지정된 파일 / 폴더를 휴지통으로 이동하도록 Finder에 요청합니다.


-에프

시스템 API를 사용하는 대신 Finder에 파일을 휴지통으로 이동하도록 요청하십시오. 속도는 느리지 만 Finder의 UI (예 : 소리)를 활용하고 "뒤로"기능이 작동하도록합니다.

-엘

현재 휴지통에있는 항목을 나열하십시오. 이 인수를 사용하면 파일을 지정할 필요가 없습니다.

-이자형

쓰레기통을 비워. 휴지통은이 작업을 실행하기 전에 확인을 요청합니다. 이 인수를 사용하면 파일을 지정할 필요가 없습니다.

설치하려면 trash터미널에서 다음을 실행하십시오.

brew install trash.


  1. rmtrash

    파일을 휴지통으로 옮기는 명령 줄 도구입니다. 명령의 매뉴얼 페이지에서 :

이 명령은 파일을 파일 시스템에서 완전히 제거하지 않고 휴지통으로 이동합니다. 결국 그 파일을 원한다면 매우 유용합니다 ...


-u USERNAME

선택적 인수 파일을 지정된 사용자의 휴지통으로 이동합니다. 이를 수행하려면 충분한 권한이 필요합니다.

설치하려면 rmtrash터미널에서 다음을 실행하십시오.

brew install rmtrash.


1

bash 프로파일에 추가하는 아주 간단한 단선 솔루션입니다. 휴지통에 이미 같은 이름의 것을 덮어 쓰게됩니다.

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

용법:

 ~/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

0

(이 확실히 복구 할 수 있도록) 제대로 물건을 부수고하는 것은 단순히보다 더 까다 롭습니다 mv~/.Trash.

osx-trash 가 원하는 것일 수 있습니다. ( 주의 사항 -시도하지 않았으며 그것이 얼마나 안전한지 보증 할 수 없습니다.)


0

확인하십시오 trash-cli. 크로스 플랫폼에서 작동하며 휴지통 사운드가 없으며 Put Back을 지원합니다.

당신이 그것을 설치할 수 있습니다 ( Node.js 필요 ) :

$ npm install --global trash-cli

또는 Node.js를 사용하지 않으려면 기본 바이너리를 osx-trash수동으로 설치할 수 있습니다.


-1

.bashrc (또는 셸의 매개 변수를 유지하는 곳)에서 다음과 같이 rm의 동작을 ~ / .Trash로 옮기는 동작을 변경하는 별칭을 추가하십시오.

alias rm='move/to/.Trash'

mv (이 직업에 사용할 주요 후보자)의 사용은 다음과 같기 때문에 (적어도 나에게는) 구현하기가 쉽지는 않습니다.

mv file where

따라서 이동 될 파일 앞에 'where'부분을 넣는 별명을 갖는 것은 꽤 스케치적일 수 있습니다. 좀 더 실질적인 조언을 얻을 수있을 것입니다.

편집 : 방금 .bashrc에 다음을 추가하려고 시도했지만 작동합니다.

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

다른 제안보다 훨씬 원시적이지만 새로운 것을 설치하지 마십시오.


3
rm설치 프로그램 스크립트를 손상시킬 수 있으므로 무엇이든 앨리어싱 하는 것은 위험합니다. 별명 rm을 지정 rm -i하고 설치를 중단 했을 때 어려운 방법을 배웠습니다 .
Old Pro

@Old Pro는 0 일부터 모든 컴퓨터에서 rm에 사용하는 별칭이며 그로 인해 문제가 발생하지 않았습니다. 예를 들어 주시겠습니까?
user1256923

3
@OldPro : .bashrc대화식 쉘 에만 사용됩니다 . ./install.sh새 프로세스 를 실행 하면 별명이 활성화 되지 않습니다 . 그러나 . install.sh현재 프로세스를 실행하면 설치 관리자가 실행되고 별칭이 활성화됩니다. RTFM ...
Mackie Messer

3
그런 다음 설치 프로그램이 대화식 쉘을 실행 중이므로 심각하게 손상되었습니다. 하나의 손상된 설치 프로그램은 일반적으로 쉘 별명에 대해 조언 할만한 충분한 이유가 아닙니다. YMMV
Mackie Messer

1
그러나 morgant가 말한 것처럼 명령의 별칭을 지정하지 않는 것이 좋습니다. 실제로 파일을 제거하지 않고 그런 별칭이 추가되지 않은 시스템에서 실수로 무언가를 삭제할 수 rm있기 때문 rm입니다. 또한 파일을 휴지통으로 옮기는 것만 큼 ​​간단 하지 않습니다mv {} ~/.Trash . 예를 들어 파일이 별도의 볼륨에 있으면 파일을 홈 디렉토리에 복사 하고 원본을 삭제합니다.
Josh

-1

나는 단순히이 스크립트를 넣었다

#!/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

에서 실행 가능 ~/bin/trash하게 만들고 chmod +x ~/bin/trash다음 줄을 추가했습니다.~/.bash_profile

PATH=$PATH:$HOME/bin

그런 다음 사용할 수 있습니다

$ trash broken.js olddir cleanup.*

-2

간단한 기능을 사용하면 파일을 사용자의 .Trash 폴더로 이동하여 파일을 휴지통으로 옮길 수 있습니다.

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

? 왜 부정적인 투표? 이것은 또한 나의 생각 일 것이다.
CousinCocaine

아마도 $*대신에 필요할 수도 있지만와 $1같은 대답으로 끝날 것입니다 mv "$@" ~/.Trash. 사람들이 부정적으로 투표하는 이유는 다른 답변의 의견을 확인하십시오.
kenorb

이 별명에주의하십시오. 파티션이나 드라이브가 하나만있는 경우 작동합니다. 두 번째 볼륨 또는 네트워크 공유에서 작업하는 경우 실제로 파일을 홈 디렉토리의 휴지통에 복사 합니다.
jmk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.