Bagaimana cara memindahkan file ke tempat sampah dari baris perintah?

129

Saya melakukan banyak pekerjaan terminal, dan hari ini memiliki pengalaman mengetik

rm fileInQuestion.txt

Sebelum mengetahui bahwa saya benar-benar membutuhkan fileInQuestion.txt. Jika saya menghapus di GUI maka saya akan mengeluarkannya dari Sampah. Saya ingin tahu apakah mungkin untuk membebani 'rm' di Terminal sedemikian rupa sehingga mengirimkan file / file ke Sampah di jalan keluar.

Joe
sumber
1
Ada beberapa program yang dapat memulihkan file yang dihapus (selama sektor-sektor pada hard drive tidak ditimpa dalam waktu yang bersamaan!). Ketika ini terjadi, Anda harus menggunakan salah satu ...
iconoclast
Juga lihat askubuntu.com/q/468721/250556 untuk googler yang mencari trashing file ubuntu / debian / linux.
ThorSummoner

Jawaban:

100

Saya tidak akan menyarankan aliasing rmuntuk mvAnda mungkin mendapatkan dalam kebiasaan rmtidak menghapus secara permanen file dan kemudian mengalami masalah pada komputer lain atau di bawah account pengguna lain ketika tidak menghapus secara permanen.

Aku menulis satu set bashscript yang menambahkan lebih banyak Mac OS X alat-seperti baris perintah (di samping sejumlah yang built-in seperti open, pbcopy, pbpaste, dll), yang paling penting trash. Versi saya trashakan melakukan semua hal yang benar yang rmtidak akan dilakukan aliasing (dan semoga tidak ada yang buruk, tapi saya telah menggunakannya di Mac saya sendiri selama beberapa tahun sekarang tanpa kehilangan data), termasuk: mengganti nama file seperti Finder jika file dengan nama yang sama sudah ada, letakkan file di folder Sampah yang benar pada volume eksternal; ia juga memiliki beberapa fitur tambahan, seperti: mencoba menggunakan AppleScript saat tersedia sehingga Anda mendapatkan suara sampah yang bagus dan semacamnya (tetapi tidak memerlukannya sehingga Anda masih dapat menggunakannya melalui SSH ketika tidak ada pengguna yang login), ia dapat memberi Anda ukuran Sampah di semua volume.

Anda dapat mengambil suite tools-osx saya dari situs saya atau versi terbaru dan terhebat dari repositori GitHub .

Ada juga sebuah trashperintah yang dikembangkan oleh Ali Rantakari , tapi saya belum diuji yang satu diri.

bermoral
sumber
4
Jawaban yang sangat bagus, jauh lebih baik dari saya!
user1256923
24
Saya sudah menggunakannya trasholeh Rantakari cukup lama dan benar-benar dapat menjaminnya. Ia dikompilasi Objective-C dan secara cerdik menggunakan API sistem file standar dan, jika gagal (mis. Pengguna tidak memiliki hak yang memadai), ia memanggil Finder untuk membuang file (secara efektif meminta otentikasi). Anda dapat membaca info lebih lanjut trashdari hasseg.org/blog .
Jari Keinänen
26
sampah juga tersedia melalui pengelola paket minuman. hanya menggunakan: brew install trash.
Landon Kuhn
8
@ landon9720 Poin bagus. Dan, untuk memperjelas orang lain, trashperintah yang tersedia melalui Homebrew adalah perintah Alai Rantakari (lihat brewformula ).
morgant
3
Saya bisa memperbaiki kesalahan dengan menjalankan brew remove trashlalu brew install trash.
Elias Zamaria
99

The sampah tool baris perintah dapat diinstal melalui brew install trash.

Ini memungkinkan Anda untuk mengembalikan file yang dihancurkan melalui baris perintah atau Finder.

Paul Wenzel
sumber
2
Solusi yang elegan!
Tuan Pei
6
Juga tersedia di macports:port install trash
holocronweaver
setiap kali saya mencoba brew install trash, saya mendapatkan ini: pastebin.com/N92cM7d8
Ben Leggiero
@ BenC.R.Leggiero Saya akan membawa masalah itu ke github.com/ali-rantakari/trash/issues . Apakah kamu brew updatepertama kali? Bekerja dengan baik pada saya.
Paul Wenzel
@ PaulWenzel ya, dan sepertinya memperbarui dengan baik. Saya akan memposting masalah.
Ben Leggiero
21

Saya memiliki executable yang dipanggil remdi suatu tempat di saya $PATHdengan konten berikut:

EDIT: kode di bawah ini adalah versi yang direvisi dan diperbaiki bekerja sama dengan 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

Berperilaku dengan cara yang persis sama dengan menghapus dari Finder. (Lihat posting blog di sini .)

Anthony Smith
sumber
4
Ini harus memiliki lebih banyak poin IMO. Karena itu adalah AppleScript, ia menggunakan proses tempat sampah yang sebenarnya untuk memindahkan file ke tempat sampah, yang berarti ia akan berperilaku sama persis. Sayang sekali one-liner tidak disediakan.
mxcl
2
Jawaban ini adalah pelajaran objek tentang bagaimana melakukan sesuatu dengan benar. Ini bekerja dengan wildcard shell dan bekerja melalui Finder. Itu tidak menemukan kembali roda, dan ini sesederhana mungkin. Saya memasukkannya ke dalam ~/bin, menamainya trash, dan berhasil pertama kali — memungkinkan saya untuk membuang banyak file dengan cara yang lebih efisien daripada jika saya harus mengekliknya di jendela Finder. Banyak terima kasih. Saya harap Anda akan mengirim lebih banyak jawaban!
Ben Kovitz
3
Versi ini menangani penawaran. Itu sedikit mengubah perilaku penanganan kesalahan, yang dalam versi di atas tampaknya tidak-sangat-hati-hati-bekerja (kesalahan untuk stdout bukan stderr, tidak ada kode keluar) tetapi kesalahan Anda dapatkan dari osascriptketika file tidak ada tidak indah sehingga Anda mungkin ingin menyempurnakan bagian itu.
Dave Abrahams
3
Pekerjaan yang baik. Versi ini memasukkan perubahan-perubahan itu, dan juga (1) mencoba meniru perintah shell rmsebanyak mungkin dalam hal menampilkan pesan ketika file tidak ada, dan (2) menyusun semuanya menjadi satu osascriptpanggilan.
Anthony Smith
4

Saya menemukan kode yang cukup bagus yang dapat ditambahkan di akhir profil kumpulan pengguna dan menyebabkan rmuntuk memindahkan file ke tempat sampah setiap kali dijalankan.

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
}

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

rraallvv
sumber
2
Ini sangat pintar tetapi saya masih tidak akan merekomendasikan ini. Itu pintar karena ini dalam profil bash untuk pengguna dan hanya pengguna yang dapat menjalankan versi fungsi ini dengan mengetiknya, skrip yang bergantung pada rm masih akan memanggil yang asli. Tetapi saya tidak akan merekomendasikan melakukan ini karena pengguna akan terbiasa dengan rm bertindak dengan cara ini ketika tidak di komputer lain. Saya akan menggunakan ini tetapi mengubah nama fungsi "sampah"
Matt Parkins
Saya menggunakan fungsi yang sama dengan dua perubahan: ① Saya mengoreksi bug dalam fungsi yang menyebabkan folder apa pun diganti namanya menjadi timestamp, jika telah dilengkapi tab untuk menyertakan trailing slash: Ini membutuhkan perubahan berikut: Mengganti sejalan local dst=${path##*/}dengan local dst=${mindtrailingslash##*/}dan menyisipkan baris lain tepat sebelum itu yang mengatakan local mindtrailingslash=${path%/}. ② Saya menggunakan namanya function rr. Seperti ini, itu tidak mengganggu dengan polos rm, tetapi nama itu sama pendek dan cepat untuk mengetik (nama lain akan melakukannya).
mach
Ubah nama rm()menjadi rmt()- Dengan cara ini Anda masih dapat menggunakan rmperintah saat Anda inginkan. Saya memikirkan rmt di kepala saya sebagai remove to trash: D
James111
4

Gunakan perintah terminal osascript, juru bahasa AppleScript.

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

Ini memberitahu Apple untuk memberitahu Finder agar mengirim file ke tempat sampah.

PWD diperlukan untuk jalur file relatif, karena AppleScript tidak mengatasinya dengan baik.

cde
sumber
1
Sederhana, efektif, dan tidak perlu menginstal apa pun! Bagus.
SilverWolf
2

pendekatan modern menggunakan 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)
}
slf
sumber
1
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah.
jherran
@ jherran terima kasih untuk pengingatnya, saya menambahkan segmen kode
slf
Ini adalah jawaban pilihan saya karena menggunakan logika dasar dan API yang sama dengan GUI.
Jason R. Coombs
1
Sekarang seandainya saja ada versi Python yang menghindari kebutuhan biner 3MB untuk membuat satu panggilan sistem.
Jason R. Coombs
1

Meskipun dimungkinkan untuk rmmemindahkan file ke Sampah alih-alih menghapusnya, saya menyarankan agar Anda tidak membawa pola pikir jaring pengaman antarmuka pengguna grafis ke UNIX shell. Ada banyak cara untuk melakukan kerusakan serius menggunakan terminal. Saran IMHO terbaik adalah dengan hanya berpikir dua kali sebelum menekan enterkunci di jendela shell.

Jika Anda ingin rmmengingatkan Anda bahwa Anda akan menghapus file, pertimbangkan untuk menggunakan alias berikut (untuk /bin/bashmemasukkan baris ini di .bashrcdirektori home Anda):

alias rm "rm -i"

Ini akan membuat rmkonfirmasi permintaan sebelum mencoba menghapus setiap file.

Jika Anda menjalankan TimeMachine (saya harap begitu!), Anda selalu dapat memperoleh file dari cadangan. Dengan cara ini Anda bisa kehilangan paling banyak satu jam kerja. Tentu saja itu cukup buruk. Jadi pikirkan lagi sebelum menekan entertombol itu!

Mackie Messer
sumber
1
Jangan lakukan itu! Skrip installer dapat menggunakan rmdan menggantung dengan alias rm -i.
Old Pro
3
@ OldPro: .bashrchanya dijalankan jika shell bersifat interaktif. Periksa halaman manual !
Mackie Messer
saya akan menyarankan untuk tidak melepas jaring pengaman, atau memperingatkan orang lain untuk melakukannya.
the0ther
Saya akan menentang para penentang dan mengatakan bahwa saya menggunakan trik ini untuk efek yang besar, tapi itu pasti hanya bisa dilakukan dengan mengetahui jebakan. Dua yang tidak disebutkan adalah bahwa ia melatih otak Anda yang rmlebih aman daripada yang akan membuat masalah Anda pada sistem lain. Juga, jika Anda gunakan -f, -isepenuhnya diabaikan. Yang mengatakan, ini adalah jaring pengaman yang baik. Sebuah satu yang lebih baik adalah untuk tidak pernah menggunakan rmdemi sebuah rmialias ( alias rmi="rm -i") atau sangat baik trashutilitas. Juga, saya akan menambahkan bahwa setiap orang harus telah menempatkan [ -f ~/.bashrc ] && source ~/.bashrcdi mereka .bash_profilesekarang.
mattmc3
1

Ada dua utilitas yang dapat diinstal melalui Homebrew yang dapat melakukan ini:

  1. sampah

    Ini adalah program baris perintah kecil untuk OS X yang memindahkan file atau folder ke tempat sampah. USP dari perintah ini adalah yang memungkinkan untuk dengan mudah mengembalikan file. Perintah untuk membuang file / folder tidak berguna jika Anda tidak dapat mengembalikan file / folder setelah membuangnya. Dari situs web perintah:

Secara default, trash meminta Finder untuk memindahkan file / folder yang ditentukan ke trash alih-alih memanggil sistem API untuk melakukan ini karena fitur "put back" yang hanya berfungsi ketika trash file melalui Finder.


-F

Minta Finder untuk memindahkan file ke tempat sampah, alih-alih menggunakan sistem API. Ini lebih lambat, tetapi menggunakan UI Finder's (mis. Suara) dan memastikan bahwa fitur "put back" berfungsi.

-l

Daftar item yang saat ini ada di tempat sampah. Jika argumen ini digunakan, tidak ada file yang perlu ditentukan.

-e

Kosongkansampahnya. trash meminta konfirmasi sebelum melakukan tindakan ini. Jika argumen ini digunakan, tidak ada file yang perlu ditentukan.

Untuk menginstal, trashjalankan yang berikut di Terminal:

brew install trash.


  1. rmtrash

    Alat baris perintah yang memindahkan file ke tempat sampah. Dari halaman manual perintah:

Perintah ini memindahkan file ke tempat sampah daripada menghapusnya secara total dari sistem file. Sangat berguna jika Anda memutuskan ingin file itu ...


-U USERNAME

argumen opsional. Ini akan memindahkan file ke sampah pengguna yang ditentukan. Perhatikan bahwa Anda perlu hak istimewa yang memadai untuk mencapai hal ini.

Untuk menginstal, rmtrashjalankan yang berikut di Terminal:

brew install rmtrash.

Nimesh Neema
sumber
1

Inilah solusi satu-baris yang cukup sepele untuk ditambahkan ke profil bash Anda. Perhatikan bahwa itu akan menimpa sesuatu dengan nama yang sama di tempat sampah.

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

Pemakaian:

 ~/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
sumber
telah diedit sesuai - terima kasih atas masukannya!
Ryan Tuck
0

Benar mencemari hal-hal (sehingga sudah pasti dipulihkan) adalah rumit dari sekedar mvuntuk ~/.Trash.

osx-trash mungkin yang Anda cari. ( Caveat emptor - Saya belum mencobanya, dan tidak bisa menjamin seberapa aman itu.)

Nix
sumber
0

Lihat trash-cli. Ini bekerja lintas platform, tidak ada suara sampah, dan mendukung Put Back.

Anda dapat menginstalnya dengan (memerlukan Node.js ) :

$ npm install --global trash-cli

Atau, jika Anda tidak ingin menggunakan Node.js, Anda dapat menginstal biner asli osx-trashsecara manual.

Sindre Sorhus
sumber
-1

Di .bashrc Anda (atau di mana pun Anda menyimpan parameter untuk shell Anda), coba tambahkan alias yang mengubah perilaku rm untuk memindahkan barang ke ~ / .Trash, seperti pada:

alias rm='move/to/.Trash'

Alias ​​ini jika jauh dari sepele untuk diterapkan (setidaknya untuk saya), karena penggunaan mv (kandidat utama untuk digunakan untuk pekerjaan ini) adalah

mv file where

jadi memiliki alias yang menempatkan bagian 'di mana' di depan file yang akan dipindahkan mungkin cukup samar. Saya akan memeriksanya dan mungkin mendapatkan saran yang lebih substansial.

EDIT: Saya baru saja mencoba menambahkan yang berikut ini ke .bashrc saya, dan berfungsi:

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

Ini jauh lebih primitif daripada saran lain, tetapi Anda menghindari menginstal barang baru.

pengguna1256923
sumber
3
Mengasingkan rmke apa pun berbahaya karena dapat merusak skrip penginstal. Saya belajar dengan cara yang sulit ketika saya alias rmuntuk rm -idan memiliki menginstal menggantung.
Old Pro
@ Tua Pro, itulah alias yang saya gunakan untuk rm di semua komputer saya, sejak hari 0, dan saya tidak pernah mengalami masalah karenanya. Mau memberi contoh?
user1256923
3
@ OldPro: .bashrchanya digunakan untuk shell interaktif . Jika Anda menjalankan ./install.shproses baru dimulai dan alias tidak akan aktif. Namun, jika Anda menjalankan . install.shproses Anda saat ini akan menjalankan installer dan alias aktif. RTFM ...
Mackie Messer
3
Kemudian penginstal menjalankan shell interaktif dan karenanya rusak parah. Salah satu installer yang rusak hampir tidak cukup alasan untuk menyarankan terhadap alias shell pada umumnya. YMMV
Mackie Messer
1
Namun, itu adalah nasihat yang baik untuk tidak alias yang rmperintah, seperti morgant kata, karena Anda akan menjadi nyaman dengan rmtidak benar-benar menghapus file dan kemudian mungkin tidak sengaja menghapus sesuatu pada sistem di mana tidak ada alias seperti telah ditambahkan. Juga, memindahkan file ke tempat sampah tidak sesederhana hanya mv {} ~/.Trash. Jika file berada pada volume yang terpisah, misalnya, ini akan menyalin file ke direktori home Anda dan menghapus yang asli.
Josh
-1

Saya hanya menempatkan skrip ini

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

di ~/bin/trash, membuatnya excutable chmod +x ~/bin/trash, dan menambahkan baris berikut ke~/.bash_profile

PATH=$PATH:$HOME/bin

Maka seseorang dapat menggunakannya sebagai

$ trash broken.js olddir cleanup.*
JP
sumber
-2

Fungsi sederhana bisa membuat Anda membuang file dengan memindahkannya ke folder .Trash pengguna:

trash() {
   mv $1 ~/.Trash
}
james.kobol
sumber
? mengapa pemungutan suara negatif? ini akan menjadi pikiranku juga ..
CousinCocaine
Anda mungkin perlu $*alih-alih $1, tetapi kemudian Anda akan berakhir dengan jawaban yang sama dengan mv "$@" ~/.Trash. Mengapa orang memberikan suara negatif, periksa komentar dari jawaban lainnya.
kenorb
Hati-hati dengan alias ini; ini berfungsi jika Anda hanya memiliki satu partisi atau drive. Jika Anda bekerja pada volume kedua atau berbagi jaringan, ini sebenarnya akan menyalin file ke sampah direktori home Anda, yang mungkin bukan yang ingin Anda lakukan!
jmk