Làm thế nào để di chuyển tập tin vào thùng rác từ dòng lệnh?


129

Tôi làm rất nhiều công việc đầu cuối, và hôm nay có kinh nghiệm gõ

rm fileInQuestion.txt

Trước khi phát hiện ra rằng tôi thực sự cần fileInQuestion.txt. Nếu tôi đã xóa trong GUI thì tôi đã thoát khỏi Thùng rác. Tôi muốn biết liệu có thể quá tải 'rm' trong Terminal theo cách mà nó sẽ gửi tệp / tệp đến Thùng rác trên đường ra không.


1
Có những chương trình có thể khôi phục các tệp đã bị xóa (miễn là các cung đó trên ổ cứng không bị ghi đè trong thời gian trung bình!). Khi điều này xảy ra, bạn nên sử dụng một trong những ...
iconoclast

Ngoài ra, hãy xem Askubfox.com/q/468721/250556 để biết các nhân viên Google đang tìm kiếm cách xử lý tệp ubfox / debian / linux.
ThorSummoner 16/07/2015

Câu trả lời:


100

Tôi sẽ không khuyên răng cưa rmđể mvkhi bạn có thể nhận được trong thói quen của rmcác file không xóa vĩnh viễn và sau đó chạy vào các vấn đề trên máy tính khác hoặc dưới tài khoản người dùng khác khi nó không xóa vĩnh viễn.

Tôi đã viết một tập hợp các bashkịch bản mà bổ sung thêm công cụ Mac OS X giống như dòng lệnh (ngoài một số những cái built-in như open, pbcopy, pbpaste, vv), quan trọng nhất trash. Phiên bản của trashtôi sẽ làm tất cả những điều chính xác mà bí danh rmsẽ không (và hy vọng không có gì xấu, nhưng tôi đã sử dụng nó trên máy Mac của mình vài năm nay mà không có dữ liệu bị mất), bao gồm: đổi tên tệp như Finder nếu một tệp có cùng tên đã tồn tại, hãy đặt các tệp vào thư mục Thùng rác chính xác trên các ổ đĩa ngoài; nó cũng có một số tính năng bổ sung, như: nó cố gắng sử dụng AppleScript khi có sẵn để bạn có được âm thanh rác hay và như vậy (nhưng không yêu cầu nên bạn vẫn có thể sử dụng nó qua SSH khi không có người dùng nào đăng nhập), nó có thể cung cấp cho bạn kích thước Thùng rác trên tất cả các khối lượng.

Bạn có thể lấy bộ công cụ osx của tôi từ trang web của tôi hoặc phiên bản mới nhất và lớn nhất từ kho GitHub .

Cũng có một trashlệnh được phát triển bởi Ali Rantakari , nhưng tôi đã không tự mình kiểm tra nó.


4
Câu trả lời tuyệt vời, tốt hơn nhiều so với của tôi!
dùng1256923

24
Tôi đã sử dụng trashRantakari trong một thời gian dài và thực sự có thể bảo đảm cho nó. Nó được biên dịch Objective-C và sử dụng khéo léo các API hệ thống tệp tiêu chuẩn và nếu không thành công (nghĩa là người dùng không có đủ quyền), nó gọi Finder để dọn rác các tệp (nhắc nhở xác thực một cách hiệu quả). Bạn có thể đọc thêm thông tin trashtừ hasseg.org/blog .
Jari Keinänen

26
thùng rác cũng có sẵn thông qua người quản lý gói bia. chỉ cần sử dụng : brew install trash.
Landon Kuhn

8
@ Landon9720 Điểm tốt. Và, để làm rõ cho những người khác, trashlệnh có sẵn thông qua Homebrew là của Alai Rantakari (xem brewcông thức ).
tha thứ

3
Tôi đã có thể sửa lỗi bằng cách chạy brew remove trashvà sau đó brew install trash.
Elias Zamaria

99

Công cụ dòng lệnh rác có thể được cài đặt thông qua brew install trash.

Nó cho phép bạn khôi phục các tệp bị hỏng thông qua dòng lệnh hoặc Finder.


2
Thật là một giải pháp tao nhã!
Ông Pei

6
Cũng có sẵn trong macports:port install trash
holocronweaver 19/07/2015

Mỗi lần tôi cố gắng brew install trash, tôi nhận được điều này: pastebin.com/N92cM7d8
Ben Leggiero

@ BenC.R.Leggiero Tôi sẽ đưa vấn đề đó đến github.com/ali-rantakari/trash/issues . Bạn đã làm brew updateđầu tiên? Hoạt động tốt vào cuối của tôi.
Paul Wenzel

@PaulWenzel có, và nó dường như cập nhật tốt. Tôi sẽ đăng một vấn đề.
Ben Leggiero

21

Tôi có một tệp thực thi được gọi remở đâu đó trong tôi $PATHvới các nội dung sau:

EDIT: mã dưới đây là phiên bản sửa đổi và cải tiến phối hợp với 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

Nó hoạt động theo cách chính xác giống như xóa khỏi Finder. (Xem bài đăng trên blog ở đây .)


4
Điều này nên có nhiều điểm IMO. Vì là AppleScript nên nó sử dụng quy trình rác thực tế để di chuyển tệp vào thùng rác, điều đó có nghĩa là nó sẽ hoạt động giống hệt nhau. Xấu hổ một lót không được cung cấp tuy nhiên.
mxcl

2
Câu trả lời này là một bài học đối tượng về cách làm những điều đúng đắn. Nó hoạt động với các ký tự đại diện nó hoạt động thông qua Finder. Nó không phát minh lại bất kỳ bánh xe nào, và nó đơn giản như có thể. Tôi đặt nó vào ~/bin, đặt tên cho nó trashvà nó hoạt động ngay lần đầu tiên cho phép tôi dọn rác toàn bộ rất nhiều tệp hiệu quả hơn so với việc tôi phải nhấp vào chúng trong cửa sổ Finder. Nhiều lòng biết ơn. Tôi hy vọng bạn sẽ đăng thêm câu trả lời!
Ben Kovitz

3
Phiên bản này xử lý báo giá. Nó thay đổi hành vi xử lý lỗi một chút, trong phiên bản trên dường như không được xử lý cẩn thận (lỗi để xuất chuẩn thay vì stderr, không có mã thoát) nhưng lỗi bạn gặp phải osascriptkhi tệp không tồn tại không đẹp nên bạn có thể muốn điều chỉnh phần đó.
Dave Abrahams

3
Công việc tốt. Phiên bản này kết hợp những thay đổi đó và (1) cố gắng bắt chước lệnh shell rmcàng nhiều càng tốt về mặt hiển thị thông báo khi tệp không tồn tại và (2) đối chiếu mọi thứ thành một osascriptcuộc gọi.
Anthony Smith


4

Tôi đã tìm thấy một mã khá đẹp có thể được thêm vào cuối hồ sơ lô của người dùng và nguyên nhân rmdi chuyển các tệp vào thùng rác mỗi khi nó được chạy.

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
}

nguồn: http://hints.macworld.com/article.php?story=20080224175659423


2
Điều này thật thông minh nhưng tôi vẫn không khuyến nghị điều này. Thật thông minh vì nó nằm trong hồ sơ bash cho người dùng và do đó chỉ người dùng mới có thể thực hiện phiên bản chức năng này bằng cách nhập nó vào, các tập lệnh dựa vào rm vẫn sẽ gọi bản gốc. Nhưng tôi không khuyên bạn nên làm điều này bởi vì người dùng sẽ quen với việc hành động theo cách này khi nó không hoạt động trên các máy khác. Tôi sẽ sử dụng cái này nhưng đổi tên hàm "thùng rác"
Matt Parkins

Tôi đang sử dụng cùng một chức năng với hai thay đổi: Tôi đã sửa một lỗi trong hàm khiến bất kỳ thư mục nào được đổi tên thành dấu thời gian, nếu nó đã được hoàn thành tab để bao gồm dấu gạch chéo: Điều này yêu cầu các thay đổi sau: Thay thế dòng local dst=${path##*/}với local dst=${mindtrailingslash##*/}và chèn một dòng khác ngay trước dòng đó nói local mindtrailingslash=${path%/}. Tôi sử dụng tên function rr. Như thế này, nó không can thiệp vào đơn giản rm, nhưng tên này ngắn và nhanh tương tự để gõ (bất kỳ tên nào khác sẽ làm).
mach

Thay đổi tên của rm()để rmt()- Bằng cách này bạn vẫn có thể sử dụng các rmlệnh khi bạn muốn. Tôi nghĩ về rmt trong đầu mình là remove to trash: D
James111

4

Sử dụng lệnh osascript, trình thông dịch AppleScript.

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

Điều này nói với AppleScript để yêu cầu Finder gửi tệp vào thùng rác.

PWD là cần thiết cho các đường dẫn tệp tương đối, vì AppleScript không xử lý tốt điều đó.


1
Đơn giản, hiệu quả, và không cần phải cài đặt bất cứ điều gì! Đẹp.
SilverWolf

2

một cách tiếp cận hiện đại bằng cách sử dụng nhanh chóng

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
Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
jherran 20/03/2015

@jherran cảm ơn vì lời nhắc, tôi đã thêm một đoạn mã
slf 20/03/2015

Đây là câu trả lời ưa thích của tôi vì nó sử dụng cùng logic và API cơ bản như GUI.
Jason R. Coombs

1
Bây giờ nếu chỉ có một phiên bản Python tránh được nhu cầu nhị phân 3 MB để thực hiện một cuộc gọi hệ thống.
Jason R. Coombs

1

Mặc dù có thể thực hiện rmdi chuyển các tệp vào Thùng rác thay vì xóa chúng, tôi khuyên bạn không nên mang suy nghĩ về mạng lưới an toàn của giao diện người dùng đồ họa vào hệ vỏ UNIX. Có nhiều cách để làm hỏng nghiêm trọng bằng cách sử dụng thiết bị đầu cuối. Lời khuyên tốt nhất IMHO là chỉ cần suy nghĩ hai lần trước khi nhấn enterphím trong cửa sổ shell.

Nếu bạn muốn rmnhắc bạn rằng bạn sắp xóa một tệp, hãy xem xét sử dụng bí danh sau (để /bin/bashđặt dòng này .bashrctrong thư mục chính của bạn):

alias rm "rm -i"

Điều này sẽ thực hiện rmxác nhận yêu cầu trước khi cố gắng loại bỏ từng tệp.

Nếu bạn có TimeMachine đang chạy (tôi hy vọng vậy!) Bạn luôn có thể lấy tệp của mình từ bản sao lưu. Bằng cách này bạn có thể mất nhiều nhất một giờ làm việc. Điều đó là đủ xấu, tất nhiên. Vì vậy, hãy suy nghĩ lại trước khi nhấn phím đó enter!


1
Đừng làm thế! Tập lệnh cài đặt có thể sử dụng rmvà treo với bí danh rm -i.
Old Pro

3
@OldPro: .bashrcchỉ được thực thi nếu shell tương tác. Kiểm tra trang người đàn ông !
Mackie Messer

Tôi sẽ khuyên không nên tháo lưới an toàn, hoặc khuyên nhủ người khác làm như vậy.
the0ther

Tôi sẽ chống lại những người không tán thành và nói rằng tôi sử dụng thủ thuật này để đạt hiệu quả cao, nhưng chắc chắn chỉ nên thực hiện khi biết những cạm bẫy. Hai điều không được đề cập là nó đào tạo bộ não của bạn rman toàn hơn nó sẽ khiến bạn gặp rắc rối trên các hệ thống khác. Ngoài ra, nếu bạn sử dụng -f, -ihoàn toàn bị bỏ qua. Điều đó nói rằng, đây là một mạng lưới an toàn tốt. Một cách tốt hơn là không bao giờ sử dụng có rmlợi cho rmibí danh ( alias rmi="rm -i") hoặc trashtiện ích tuyệt vời . Ngoài ra, tôi sẽ thêm rằng mọi người nên đặt [ -f ~/.bashrc ] && source ~/.bashrcchúng .bash_profilevào lúc này.
mattmc3

1

Có hai tiện ích có thể cài đặt qua Homebrew có thể thực hiện điều này:

  1. rác

    Đây là một chương trình dòng lệnh nhỏ dành cho OS X để di chuyển các tệp hoặc thư mục vào thùng rác. USP của lệnh này là cho phép dễ dàng khôi phục các tệp. Lệnh sử dụng tệp / thư mục rác không được sử dụng nếu bạn không thể khôi phục tệp / thư mục sau khi bỏ rác. Từ trang web của lệnh:

Theo mặc định, thùng rác yêu cầu Finder di chuyển các tệp / thư mục được chỉ định vào thùng rác thay vì gọi API hệ thống để thực hiện việc này vì tính năng "đặt lại" chỉ hoạt động khi chuyển các tệp qua Finder.


-ĐỤ

Yêu cầu Finder di chuyển các tệp vào thùng rác, thay vì sử dụng API hệ thống. Việc này chậm hơn, nhưng nó sử dụng Giao diện người dùng (ví dụ âm thanh) và đảm bảo tính năng "đặt lại" hoạt động.

-l

Liệt kê các mục hiện đang trong thùng rác. Nếu đối số này được sử dụng, không có tệp nào cần được chỉ định.

-e

Dọn rác. thùng rác yêu cầu xác nhận trước khi thực hiện hành động này. Nếu đối số này được sử dụng, không có tệp nào cần được chỉ định.

Để cài đặt, hãy trashchạy như sau trong Terminal:

brew install trash.


  1. rmtrash

    Một công cụ dòng lệnh di chuyển các tập tin vào thùng rác. Từ trang man của lệnh:

Lệnh này di chuyển tệp vào thùng rác thay vì loại bỏ chúng hoàn toàn khỏi hệ thống tệp. Rất hữu ích nếu bạn quyết định bạn muốn tập tin đó sau tất cả ...


-U NGƯỜI DÙNG

một đối số tùy chọn. Điều này sẽ di chuyển tệp vào thùng rác của người dùng được chỉ định. Lưu ý rằng bạn cần có đủ đặc quyền để thực hiện điều này.

Để cài đặt, hãy rmtrashchạy như sau trong Terminal:

brew install rmtrash.


1

Đây là một giải pháp một dòng khá nhỏ để thêm vào hồ sơ bash của bạn. Lưu ý rằng nó sẽ ghi đè lên một cái gì đó có cùng tên trong thùng rác.

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

Sử dụng:

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

đã chỉnh sửa cho phù hợp - cảm ơn bạn đã đóng góp!
Ryan Tuck

0

Đúng làm dơ bẩn thứ (để nó chắc chắn là thu hồi) là phức tạp hơn so với chỉ đơn giản là một mvđể ~/.Trash.

osx-thùng rác có thể là những gì bạn đang tìm kiếm. ( Trống rỗng - Tôi đã không thử nó và không thể đảm bảo mức độ an toàn của nó.)


0

Kiểm tra trash-cli. Nó hoạt động đa nền tảng, không có âm thanh rác và hỗ trợ Đặt lại.

Bạn có thể cài đặt nó với (yêu cầu Node.js ) :

$ npm install --global trash-cli

Ngoài ra, nếu bạn không muốn sử dụng Node.js, bạn có thể cài đặt nhị phân gốc osx-trashtheo cách thủ công.


-1

Trong .bashrc của bạn (hoặc bất cứ nơi nào bạn giữ các tham số cho trình bao của mình), hãy thử thêm một bí danh thay đổi hành vi của rm để chuyển công cụ sang ~ / .Trash, như trong:

alias rm='move/to/.Trash'

Bí danh này nếu xa tầm thường để thực hiện (ít nhất là đối với tôi), bởi vì việc sử dụng mv (ứng cử viên chính để sử dụng cho công việc này) là

mv file where

do đó, có một bí danh đặt phần 'nơi' ở phía trước tệp sẽ được di chuyển có thể khá sơ sài. Tôi sẽ xem xét nó có thể nhận được lời khuyên đáng kể hơn.

EDIT: Tôi vừa thử thêm phần sau vào .bashrc của mình và nó hoạt động:

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

Nó nguyên thủy hơn nhiều so với các đề xuất khác, nhưng bạn tránh cài đặt công cụ mới.


3
Bí danh rmcho bất cứ điều gì là nguy hiểm vì nó có thể phá vỡ các tập lệnh cài đặt. Tôi học được điều này một cách khó khăn khi tôi aliased rmđể rm -ivà đã cài đặt treo.
Old Pro

@Old Pro, đó là bí danh tôi sử dụng cho rm trong tất cả các máy tính của tôi, kể từ ngày 0 và tôi chưa bao giờ gặp sự cố vì nó. Muốn đưa ra một ví dụ?
dùng1256923

3
@OldPro: .bashrcchỉ được sử dụng cho hệ vỏ tương tác . Nếu bạn chạy ./install.shmột tiến trình mới được bắt đầu và bí danh sẽ không được kích hoạt. Tuy nhiên, nếu bạn chạy . install.shquy trình hiện tại của bạn sẽ thực thi trình cài đặt và bí danh được kích hoạt. RTFM ...
Mackie Messer

3
Sau đó, trình cài đặt đang chạy một vỏ tương tác và do đó đã bị hỏng nghiêm trọng. Một trình cài đặt bị hỏng hầu như không đủ lý do để khuyên chống lại bí danh shell nói chung. YMMV
Mackie Messer

1
Tuy nhiên, lời khuyên tốt không nên bí danh rmlệnh, như morgant đã nói, bởi vì bạn sẽ trở nên thoải mái khi rmkhông thực sự xóa các tệp và sau đó có thể vô tình xóa một cái gì đó trên một hệ thống không có bí danh nào được thêm vào. Ngoài ra, việc chuyển một file vào thùng rác là không đơn giản như chỉ mv {} ~/.Trash. Ví dụ, nếu tệp nằm trên một ổ đĩa riêng, điều này sẽ sao chép tệp vào thư mục chính của bạn và xóa bản gốc.
Josh

-1

Tôi chỉ đơn giản là đặt kịch bản này

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

trong ~/bin/trash, làm cho nó tuyệt vời chmod +x ~/bin/trash, và thêm dòng sau vào~/.bash_profile

PATH=$PATH:$HOME/bin

Sau đó, người ta có thể sử dụng nó như là

$ trash broken.js olddir cleanup.*

-2

Một chức năng đơn giản có thể cho phép bạn xóa các tệp rác bằng cách di chuyển chúng vào thư mục .Trash của người dùng:

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

? Tại sao một cuộc bỏ phiếu tiêu cực? đây cũng là suy nghĩ của tôi ..
CousinCocaine

Bạn có thể cần $*thay vì $1, nhưng sau đó bạn sẽ có cùng một câu trả lời như mv "$@" ~/.Trash. Tại sao mọi người bỏ phiếu tiêu cực, kiểm tra các ý kiến ​​từ câu trả lời khác.
kenorb

Hãy cẩn thận với bí danh này; Điều này hoạt động nếu bạn chỉ có một phân vùng hoặc ổ đĩa. Nếu bạn đang làm việc trên một khối lượng thứ hai hoặc mạng chia sẻ, điều này thực sự sẽ sao chép các tập tin vào thùng rác thư mục home của bạn, mà có lẽ không phải những gì bạn muốn làm!
jmk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.