Dosyaları komut satırından çöp kutusuna nasıl taşıyabilirim?


129

Çok fazla terminal çalışması yapıyorum ve bugün yazı yazma deneyimim oldu.

rm fileInQuestion.txt

Öğrenmeden önce aslında fileInQuestion.txt dosyasına ihtiyacım olduğunu gördüm. Eğer GUI’de silinmiş olsaydım, çöp kutusundan yeni çıkardım. Terminal'de 'rm' yi, dosya / dosyaları çıkış yoluna gönderecek şekilde aşırı yüklemenin mümkün olup olmadığını bilmek istiyorum.


1
Silinen dosyaları kurtarabilecek programlar vardır (sabit sürücüdeki bu sektörlerin üzerine yazılmadığı sürece!). Bu olduğunda, bunlardan birini kullanmalısın ...
iconoclast

Ayrıca , ubuntu / debian / linux dosyalarının silinmesini arayan googlers için askubuntu.com/q/468721/250556 adresini ziyaret edin.
ThorSummoner 16:15

Yanıtlar:


100

Ben yumuşatma tavsiye etmem rmiçin mvsize alışkanlığı elde edebileceğiniz gibi rmkalıcı silme değil dosya ve sonra, diğer bilgisayarlarda veya diğer kullanıcı hesapları altında sorunları çalıştırmak yok kalıcı olarak silmek.

Ben bir dizi yazdı bash(gibi yerleşik olanlar bir dizi ek olarak daha Mac OS X benzeri bir komut satırı araçlarını eklemek komut open, pbcopy, pbpasteen önemlisi, vs.) trash. Benim trashsürümüm rm, takma adın yapamayacağı tüm doğru şeyleri (ve umarım kötü bir şey yapmaz, ancak birkaç yıldan beri kaybolmuş veriler olmadan kendi Mac'lerimde kullanıyorum) da dahil olmak üzere: Finder'ın yaptığı dosyayı yeniden adlandırmak aynı ada sahip bir dosya zaten varsa, dosyaları dış birimlerde doğru Çöp Kutusu klasörüne koymak; aynı zamanda bazı ekleri de içeriyor, örneğin: AppleScript'i kullanmaya çalıştığında, böylece güzel bir çöp sesi elde edersiniz (ama bunu gerektirmez, böylece hiçbir kullanıcı oturum açmadığında hala SSH üzerinden kullanabilirsiniz), Tüm hacimlerde size Çöp Kutusu boyutu verin.

Tools-osx takımımı sitemden veya GitHub deposundaki en yeni ve en büyük sürümden kapabilirsiniz .

Ali Rantakari tarafından geliştirilen bir trashemir de var , ama bunu kendim test etmedim.


4
Mükemmel cevap, benimkinden çok daha iyi!
user1256923

24
Ben kullandım trashuzunca bir süre Rantakari tarafından ve gerçekten bunun için kefil olabilir. Objective-C derlenir ve akıllıca standart dosya sistemi API'lerini kullanır ve başarısız olması durumunda (yani, kullanıcı yeterli haklara sahip değilse), dosyaları çöpe atmak için Finder'ı çağırır (etkin bir şekilde kimlik doğrulama isteminde bulunur). Sen fazla bilgi okuyabilir trashgelen hasseg.org/blog .
Jari Keinänen

26
demlemek demlemek paket yöneticisi aracılığıyla da mevcuttur. Sadece kullanın: brew install trash.
Landon Kuhn,

8
@ landon9720 İyi nokta. Ve başkalarına açıklık getirmek için, Homebrewtrash aracılığıyla erişilebilen komut Alai Rantakari'nindir ( formüle bakınız ). brew
morgant

3
Ben brew remove trashve sonra çalıştırarak hatayı düzeltmek başardı brew install trash.
Elias Zamaria

99

Çöp komut satırı aracı vasıtasıyla monte edilebilir brew install trash.

Çöken dosyaları komut satırı veya Finder aracılığıyla geri yüklemenizi sağlar.


2
Ne kadar zarif bir çözüm!
Pei,

6
MacPorts de kullanılabilir:port install trash
holocronweaver

her denediğimde brew install trash, şunu alıyorum: pastebin.com/N92cM7d8
Ben Leggiero 30:15

@ BenC.R.Leggiero Bu konuyu github.com/ali-rantakari/trash/issues adresine devrederim . brew updateİlk sen mi yaptın ? Benim tarafımda iyi çalışıyor.
Paul Wenzel

@ PaulWenzel evet, ve sadece güncelleme gibi görünüyor. Bir sorun göndereceğim.
Ben Leggiero 12:15

21

Aşağıdaki içeriğe sahip bir remyerimde adı verilen bir çalıştırılabilir program var $PATH:

EDIT: Aşağıdaki kod Dave Abrahams ile işbirliği içinde gözden geçirilmiş ve geliştirilmiş bir versiyonudur :

#!/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'dan silmekle aynı şekilde davranır. ( Buradaki blog gönderisine bakın .)


4
Bunun daha fazla puanı IMO olmalı. AppleScript olduğundan, dosyayı çöp kutusuna taşımak için gerçek çöp tenekesini kullanır, bu da tam olarak aynı davranacağı anlamına gelir. Ancak bir utanç vermedi.
mxcl

2
Bu cevap, işlerin nasıl doğru yapılacağına dair nesne dersidir. Bu kabuk joker ile çalışır ve o Finder yoluyla çalışır. Herhangi bir tekerleği yeniden icat etmiyor ve olabildiğince basit. Ben onu koydum ~/bin, adlandırdım trashve ilk defa çalıştı - bu sayede Finder pencerelerinde tıklamak zorunda kaldığımdan çok daha fazla dosyayı daha verimli bir şekilde çöpe atmamı sağladı. Çok şükran. Umarım daha fazla cevap gönderirsiniz!
Ben Kovitz

3
Bu sürüm tırnaklarla ilgilenir. Hata işleme davranışını biraz değiştirir, yukarıdaki sürümde çok dikkatlice çalışılmamış gibi görünür (stderr yerine stdout hatası, çıkış kodu yok), ancak osascriptdosya bulunmadığında aldığınız hata güzel değil bu yüzden o parçayı ayarlamak isteyebilirsiniz.
Dave Abrahams,

3
İyi iş. Bu sürüm , bu değişiklikleri içerir ve ayrıca (1) rm, dosyalar olmadığında mesajları görüntüleme açısından shell komutunu mümkün olduğunca taklit etmeye çalışır ve (2) her şeyi tek bir osascriptçağrıya harmanlar .
Anthony Smith


4

Kullanıcının toplu profilinin sonuna eklenebilecek oldukça güzel bir kod buldum ve rmher çalıştırıldığında dosyaları çöp kutusuna taşıyor.

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
}

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


2
Bu zeki ama yine de bunu tavsiye etmem. Zekice çünkü kullanıcı için bash profilinde ve sadece kullanıcı fonksiyonun bu versiyonunu yazarak çalıştırabiliyor. Ancak bunu yapmayı tavsiye etmem çünkü kullanıcı diğer makinelerde olmadığında bu şekilde davranmaya alışır. Bunu kullanacağım ancak "çöp kutusu" işlevini yeniden adlandıracağım
Matt Parkins

Aynı işlevi iki değişiklikle kullanıyorum: ① Herhangi bir klasörün zaman damgasına göre yeniden adlandırılmasına neden olan ve sonunda eğik çizgi eklemek için sekme işlemi tamamlandıysa, hatayı düzelttim: Bu, aşağıdaki değişiklikleri gerektirir: çizgi local dst=${path##*/}ile local dst=${mindtrailingslash##*/}ve sadece söylüyor önce de bir başka çizgi ekleme local mindtrailingslash=${path%/}. ② Adı kullanıyorum function rr. Bunun gibi, ovaya karışmaz rm, ancak isim benzer şekilde kısa ve hızlıdır (başka bir isim de yapabilir).
mach

Adını değiştirme rm()için rmt()kullanmaya devam edebilirsiniz Bu şekilde - rmİstediğiniz zaman komutu. Kafamda rmt düşünüyorum remove to trash: D
James111 6

4

Osascript, AppleScript yorumlayıcısı terminal komutunu kullanın.

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

Bu, AppleScript'e Finder'a dosyayı çöpe göndermesini bildirmesini söyler.

PScript, göreceli dosya yolları için gereklidir, çünkü AppleScript çok iyi işlemez.


1
Basit, etkili ve hiçbir şey yüklemenize gerek yok! Güzel.
SilverWolf

2

hızlı kullanarak modern bir yaklaşım

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
Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak daha iyidir. Bağlantılı sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir.
jherran

@jherran hatırlatma için teşekkürler, bir kod segmenti ekledim
slf

Bu benim tercih edilen cevabım çünkü GUI ile aynı temel mantığı ve API'leri kullanıyor.
Jason R. Coombs

1
Şimdi sadece bir sistem çağrısı yapmak için 3 MB'lık bir ikiliye ihtiyaç duyulmasını önleyen bir Python sürümü olsaydı.
Jason R. Coombs

1

rmDosyaları kaldırmak yerine Çöp dosyalarına taşıma yapmak mümkün olsa da, grafiksel kullanıcı arabirimlerinin güvenlik ağını zihniyetin UNIX kabuğuna getirmesini öneriyorum. Terminali kullanarak ciddi hasar almanın birçok yolu vardır. En iyi tavsiye IMHO, enterbir kabuk penceresinde anahtara basmadan önce iki kez düşünmektir .

Size rmbir dosyayı silmek üzere olduğunuzu hatırlatmak istiyorsanız, aşağıdaki takma adı kullanmayı düşünün ( /bin/bashbu satırı .bashrcana dizininize koymak için ):

alias rm "rm -i"

Bu, her dosyayı rmkaldırmayı denemeden önce istek onayı yapacaktır .

Eğer TimeMachine çalıştırıyorsa (umarım öyledir!) Dosyanızı daima yedekten alabilirsiniz. Bu şekilde en fazla bir saatlik çalışmayı kaybedebilirsiniz. Tabii ki yeterince kötü. Bu entertuşa basmadan önce tekrar düşünün !


1
Yapma! Yükleyici komut dosyaları rmdiğer adları kullanabilir ve takılabilir rm -i.
Eski Pro

3
@OldPro: .bashrcsadece kabuk etkileşimli ise çalıştırılır. Kontrol man sayfasına !
Mackie Messer

Güvenlik ağlarını çıkarmamaya veya başkalarının bunu yapmasını tavsiye etmeme konusunda tavsiyede bulunabilirim.
16

Naysayers'a karşı çıkacağım ve bu numarayı harika bir etki için kullandığımı söyleyeceğim, ancak kesinlikle sadece tuzaklar bilinerek yapılmalı. Bahsedilmeyen iki şey, beyninizi rm, diğer sistemlerde başınızı belaya sokacak olandan daha güvenli bir şekilde eğitmesidir. Ayrıca, kullanırsanız -f, -itamamen göz ardı edilir. Bu iyi bir güvenlik ağı olduğunu söyledi. Daha iyisi, asla rmbir rmitakma ad ( alias rmi="rm -i") veya mükemmel trashfayda için kullanmamaktır. Ayrıca, herkesin sarf etmesi gerektiği konusunda ekleyeceğiz [ -f ~/.bashrc ] && source ~/.bashrckendi içinde .bash_profileartık.
mattmc3

1

Bunu gerçekleştirebilecek Homebrew aracılığıyla yüklenebilen iki yardımcı program vardır :

  1. çöp

    Bu, OS X için dosya veya klasörleri çöp kutusuna taşıyan küçük bir komut satırı programıdır. Bu komutun USP'si, dosyaları kolayca geri yüklemenizi sağlar. Dosyaları / klasörleri çöpe atma komutu, dosyaları / klasörleri çöktükten sonra geri yükleyemezseniz kullanılamaz. Komutun web sitesinden:

Varsayılan olarak, çöp kutusu Finder'dan belirtilen dosyaları / klasörleri, yalnızca dosyaları Finder aracılığıyla değiştirirken çalışan "geri koy" özelliği nedeniyle sistem API'sini çağırmak yerine çöp kutusuna taşımasını ister.


-F

Sistem API'sini kullanmak yerine, Finder'dan dosyaları çöp kutusuna taşımasını isteyin. Bu daha yavaştır, ancak Finder Kullanıcı Arayüzünü kullanır (örn. Sesler) ve "geri koy" özelliğinin çalışmasını sağlar.

-l

Şu anda çöp kutusundaki öğeleri listeleyin. Bu argüman kullanılırsa, dosya belirtilmesi gerekmez.

-e

Boş çöp. Bu işlemi gerçekleştirmeden önce çöp kutusu onay ister. Bu argüman kullanılırsa, dosya belirtilmesi gerekmez.

Yüklemek trashiçin Terminal'de aşağıdakileri çalıştırın:

brew install trash.


  1. rmtrash

    Dosyaları çöp kutusuna taşıyan bir komut satırı aracı. Komutun man sayfasından:

Bu komut, dosyaları tamamen dosya sisteminden kaldırmak yerine çöp kutusuna taşır. Ne de olsa o dosyayı istediğine karar verirsen ...


-u KULLANICI ADI

isteğe bağlı bir argüman. Bu, dosyayı belirtilen kullanıcının çöp kutusuna taşıyacaktır. Bunu gerçekleştirmek için yeterli ayrıcalıklara ihtiyacınız olduğunu unutmayın.

Yüklemek rmtrashiçin Terminal'de aşağıdakileri çalıştırın:

brew install rmtrash.


1

İşte bash profilinize eklemek için oldukça önemsiz tek satırlık bir çözüm. Çöp kutusunda aynı ada sahip bir şeyin üzerine yazacağını unutmayın.

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

Kullanımı:

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

buna göre düzenleme yaptım - giriş için teşekkür ederim!
Ryan Tuck

0

Düzgün bir şekilde eşyaları dökerek (kesinlikle kurtarılabilir olması için) basitçe bir mvden daha zordur ~/.Trash.

osx-trash , aradığın şey olabilir. ( Caveat emptor - Denemedim ve ne kadar güvenli olduğu konusunda garanti veremem.)


0

Kontrol edin trash-cli. Çapraz platform çalışıyor, çöp sesi duymuyor ve Put Back'i destekliyor.

İle kurabilirsiniz ( Node.js gerektirir ) :

$ npm install --global trash-cli

Alternatif olarak, Node.js kullanmak istemiyorsanız, yerel ikiliyi osx-trashelle yükleyebilirsiniz .


-1

.Bashrc'nizde (ya da kabuğunuzun parametrelerini nerede tuttuğunuzda), rm'nin hareket eden şeylere davranışını değiştiren bir takma ad eklemeyi deneyin:

alias rm='move/to/.Trash'

Bu takma ad, uygulama için önemsiz olmaktan uzak olsa (en azından benim için), çünkü mv kullanımı (bu iş için kullanılacak birincil aday)

mv file where

bu nedenle, taşınacak dosyanın önüne 'nerede' kısmını koyan bir diğer adı kullanmak oldukça kabataslak olabilir. Daha önemli bir tavsiye almak için bu konuyu inceleyeceğim.

EDIT: Sadece benim .bashrc benim aşağıdakini eklemek için çalıştı ve işe yarıyor:

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

Diğer önerilere göre çok daha ilkeldir, ancak yeni şeyler yüklemekten kaçınırsınız.


3
rmHerhangi birşeye takma tehlikelidir çünkü kurucu komut dosyalarını kırabilir. Takma ve takma rmişlemlerini yaparken zor yoldan öğrendim rm -i.
Eski Pro

@Old Pro, tüm bilgisayarlarımda rm için kullandığım takma ad, 0 günden beri ve bundan dolayı hiç sorun yaşamadım. Örnek vermek ister misin?
user1256923

3
@OldPro: .bashrcsadece etkileşimli kabukları için kullanılır . Eğer çalıştırırsanız ./install.shyeni bir süreç başlatılır ve takma edecek değil aktif olması. Ancak, . install.shmevcut işleminizi yürütürseniz yükleyiciyi yürütür ve diğer adı etkin olur. RTFM ...
Mackie Messer

3
Sonra yükleyici etkileşimli bir kabuk çalıştırıyordu ve bu nedenle ciddi şekilde kırıldı. Bir kırık yükleyici, genel olarak kabuk takma adlarına karşı tavsiyede bulunmak için yeterli bir neden değildir. YMMV
Mackie Messer

1
Ancak, bir diğer ad değil iyi tavsiye rmmorgant söylediği gibi kendinizi rahat olacaksınız, çünkü komutu rmyanlışlıkla böyle bir takma ad eklenen bir sistem üzerinde bir şey silebilir sonra aslında dosyaları kaldırarak değil ve. Ayrıca, bir dosyayı çöp kutusuna taşımak da bu kadar basit değildirmv {} ~/.Trash . Dosya ayrı bir birimdeyse, örneğin bu dosyayı ana dizininize kopyalar ve orijinali siler.
Josh,

-1

Ben sadece bu betiği koydum

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

içinde ~/bin/trash, hesaplanabilir hale getirildi chmod +x ~/bin/trashve aşağıdaki satırı ekledi:~/.bash_profile

PATH=$PATH:$HOME/bin

O zaman kişi olarak kullanabilir.

$ trash broken.js olddir cleanup.*

-2

Basit bir işlev, dosyaları kullanıcının .Trash klasörüne taşıyarak çöpe atmanıza izin verebilir:

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

? neden olumsuz bir oylama? Bu benim de düşüncem olurdu ..
KuzenCocaine

Muhtemelen $*yerine ihtiyacın var $1, ama sonra aynı cevapla sonuçlanırdı mv "$@" ~/.Trash. Neden insanlar olumsuz oy veriyorlarsa, diğer cevaptan gelen yorumları kontrol edin.
kenorb

Bu takma isme dikkat edin; bu, yalnızca bir bölümünüz veya sürücünüz varsa çalışır. İkinci bir cilt veya ağ paylaşımı üzerinde çalışıyorsanız, bu dosyayı ev yöneticinizin çöplüğüne kopyalar ; bu muhtemelen yapmak istediğiniz şey değildir!
jmk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.