コマンドラインからファイルをゴミ箱に移動する方法は?


129

私は多くの端末作業を行っており、今日はタイピングの経験がありました

rm fileInQuestion.txt

実際にfileInQuestion.txtが必要だったことを知る前に。GUIで削除した場合は、ごみ箱から取り出しただけです。ターミナルで「rm」をオーバーロードすることが可能かどうかを知りたいのですが、途中でファイルをゴミ箱に送信します。


1
削除されたファイルを回復できるプログラムがあります(ハードドライブ上のセクターがその間に上書きされない限り!)。これが起こるとき、あなたはそれらの...のいずれかを使用する必要があり
アイコノクラスト

また、ubuntu / debian / linuxファイルのゴミ箱を探しているGoogle社員については、askubuntu.com / q / 468721/250556を参照してください。
ThorSummoner

回答:


100

私はエイリアシング助言しませんrmmv、あなたが習慣になるかもしれないとrm永久にファイルを削除していないし、それはときに、他のコンピュータ上またはその他のユーザーアカウントの下で問題に遭遇しない永久に削除します。

最も重要bashなのopenpbcopy、Mac OS Xに似たコマンドラインツールを追加する一連のスクリプト(およびpbpaste、などの組み込みツールに加えて)を記述したことtrashです。私のバージョンはtrash、エイリアスrmができないすべての正しいことを行います(そして、うまくいけば悪いことはありませんが、データを失うことなく数年間自分のMacで使用しています)、Finderのようにファイルの名前を変更する同じ名前のファイルが既に存在する場合、外部ボリューム上の正しいゴミ箱フォルダーにファイルを入れます。また、利用可能なときにAppleScriptを使用しようとするため、素敵なゴミの音などが得られます(ただし、ユーザーがログインしていないときにSSH経由で使用できるようにする必要はありません)。すべてのボリュームでゴミ箱のサイズを指定します。

私のサイトからtools-osxスイートを、またはGitHubリポジトリから最新かつ最高のバージョンを入手できます

Ali Rantakariによって開発されtrashコマンドもありますが、私はそれを自分でテストしていません。


4
優れた答え、私のものよりもはるかに良い!
user1256923

24
私はtrashかなり長い間ランタカリで使用してきましたが、本当にそれを保証できます。Objective-Cでコンパイルされ、標準のファイルシステムAPIを巧みに使用します。失敗した場合(つまり、ユーザーに十分な権限がない場合)、Finderを呼び出してファイルを破棄します(効果的に認証を要求します)。詳細についてはtrashhasseg.org / blogをご覧ください
ヤリケイネン

26
ゴミ箱はbrew package managerからも入手できます。ちょうど使用しますbrew install trash
ランドンクーン

8
@ landon9720良い点。そして、他の人のために明確にするために、Homebrewtrash利用できるコマンドはAlai Rantakariのものです(公式を参照)。brew
モーガン

3
を実行してbrew remove trashからエラーを修正することができましたbrew install trash
エリアスザマリア

99

ゴミのコマンドラインツールを介してインストールすることができますbrew install trash

コマンドラインまたはFinderを使用して、ごみ箱に入れたファイルを復元できます。


2
なんてエレガントなソリューションでしょう!
ペイ氏

6
macportsでも利用可能:port install trash
holocronweaver

私がしようとするたびにbrew install trash:、私はこの取得pastebin.com/N92cM7d8
ベンLeggiero

@ BenC.R.Leggiero私はその問題をgithub.com/ali-rantakari/trash/issuesに引き継ぎます。君がやったbrew update最初の?私の側でうまくいく。
ポールウェン

@PaulWenzelはい、それはうまく更新されているようです。問題を投稿します。
ベンレジェロ

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
この答えは、物事を正しく行う方法のオブジェクトレッスンです。これは、シェルのワイルドカードと連携し、それはファインダーを介して動作します。車輪を再発明することはなく、可能な限りシンプルです。私はそれを~/binに名前を付けてtrash初めて使いました。Finderウィンドウでクリックするよりもずっと効率的に大量のファイルをゴミ箱に捨てることができました。感謝します。もっと回答を投稿してください!
ベンコビッツ

3
このバージョンは引用符を処理します。エラー処理の動作を少し変更します。上記のバージョンでは、あまり細心の注意を払っていないようです(stderrではなくstdoutへのエラー、終了コードなし)がosascript、ファイルが存在しない場合に発生するエラー美しくないので、その部分を調整したいかもしれません。
デイブアブラハム

3
良くやった。このバージョンにはこれらの変更が組み込まれており、(1)rmファイルが存在しない場合のメッセージの表示に関して、可能な限りシェルコマンドを模倣しようとしosascriptます。(2)すべてを単一の呼び出しに照合します。
アンソニースミス


4

ユーザーのバッチプロファイルの最後に追加でき、rm実行するたびにファイルをゴミ箱に移動させる非常に素晴らしいコードを見つけました。

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
}

ソース:http : //hints.macworld.com/article.php?story=20080224175659423


2
これは非常に賢い方法ですが、それでもお勧めしません。ユーザーのbashプロファイルにあるため、ユーザーがこのバージョンの関数を入力できるのはrmに依存するスクリプトのみであるため、これは賢い方法です。しかし、他のマシン上ではない場合、ユーザーはこの方法でrmの動作に慣れるので、これを行うことはお勧めしません。これを使用しますが、関数の名前を「ゴミ箱」に変更します
マットパーキンズ14

私は2つの変更を加えて同じ関数を使用しています。ラインlocal dst=${path##*/}local dst=${mindtrailingslash##*/}だけ言って、1つの前に別の行を挿入しますlocal mindtrailingslash=${path%/}。②私は名前を使用しますfunction rr。このように、それはplainと干渉しませんrmが、名前は同様に短くて速く入力できます(他の名前でもかまいません)。
マッハ

の名前rm()rmt()-に変更するとrm、必要なときにコマンドを使用できます。私は私の頭の中のremove to trash
RMT

4

AppleScriptインタープリターである端末コマンドosascriptを使用します。

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

これにより、AppleScriptはFinderにファイルをゴミ箱に送るように指示します。

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のリマインダーに感謝します。コードセグメントを追加しました
slf

これは、GUIと同じ基礎となるロジックとAPIを使用するため、私の好みの答えです。
ジェイソンR.クームス

1
1つのシステムコールを行うために3MBのバイナリを必要としないPythonバージョンがあった場合のみ。
ジェイソンR.クームス

1

rmファイルを削除する代わりにゴミ箱に移動することは可能ですが、グラフィカルユーザーインターフェイスのセーフティネットの考え方をUNIXシェルに持ち込むことはお勧めしません。ターミナルを使用して深刻な損害を与える方法はたくさんあります。IMHOの最善のアドバイスenterは、シェルウィンドウでキーを押す前に2回考えることです。

rmファイルを削除しようとしていることを思い出したい場合は、次のエイリアスを使用することを検討してください(ホームディレクトリ/bin/bashにこの行を入れるため.bashrc):

alias rm "rm -i"

これrmにより、ファイルを削除する前に要求の確認が行われます。

TimeMachineを実行している場合(そう願っています!)、いつでもバックアップからファイルを取得できます。この方法では、せいぜい1時間の仕事しか失うことができません。もちろん、これで十分です。そのため、そのenterキーを押す前にもう一度考えてください!


1
しないでください!インストーラスクリプトはrm、エイリアスを使用してハングする場合がありますrm -i
オールドプロ

3
@OldPro:.bashrcシェルがインタラクティブな場合にのみ実行されます。マニュアルページを確認してください
マッキーメッサー

セーフティネットを削除したり、他の人にそうするように忠告したりしないことをお勧めします。
the0ther

私は反対者に反対し、私はこのトリックを非常に効果的に使用すると言いますが、間違いは落とし穴を知っている場合にのみ行うべきです。言及されていない2つはrm、他のシステムで問題が発生するよりも安全な脳を訓練することです。また、を使用すると-f-i完全に無視されます。とはいえ、これは優れたセーフティネットです。より良い方法rmは、rmiエイリアス(alias rmi="rm -i")または優れたtrashユーティリティを優先して使用しないことです。また、私は誰もが今までに入れ[ -f ~/.bashrc ] && source ~/.bashrcておくべきだったと付け加えます.bash_profile
mattmc3

1

これを実現できるHomebrewを介してインストール可能な2つのユーティリティがあります。

  1. ゴミ

    これは、ファイルまたはフォルダーをごみ箱に移動するOS X用の小さなコマンドラインプログラムです。このコマンドのUSPを使用すると、ファイルを簡単に復元できます。ファイル/フォルダーをゴミ箱に移動した後、ファイル/フォルダーを復元できない場合は、コマンドを使用しても意味がありません。コマンドのWebサイトから:

既定では、ゴミ箱は、Finderを使用してファイルをゴミ箱に移動するときにのみ機能する「プットバック」機能により、システムAPIを呼び出す代わりに、指定されたファイル/フォルダをゴミ箱に移動するようにFinderに要求します。


-F

システムAPIを使用する代わりに、Finderにファイルをゴミ箱に移動するよう依頼してください。これは遅くなりますが、FinderのUI(サウンドなど)を利用し、「プットバック」機能が確実に機能するようにします。

-l

現在ゴミ箱にあるアイテムをリストします。この引数を使用する場合、ファイルを指定する必要はありません。

-e

ゴミ箱を空にします。ゴミ箱はこのアクションを実行する前に確認を求めます。この引数を使用する場合、ファイルを指定する必要はありません。

インストールtrashするには、ターミナルで次を実行します。

brew install trash


  1. rmtrash

    ファイルをゴミ箱に移動するコマンドラインツール。コマンドのmanページから:

このコマンドは、ファイルをファイルシステムから完全に削除するのではなく、ごみ箱に移動します。あなたが結局そのファイルが欲しいと決めるなら非常に便利です...


-uユーザー名

オプションの引数。これにより、指定したユーザーのゴミ箱にファイルが移動します。これを行うには十分な権限が必要であることに注意してください。

インストールrmtrashするには、ターミナルで次を実行します。

brew install rmtrash


1

これは、bashプロファイルに追加する非常に簡単な1行のソリューションです。既にゴミ箱にある同じ名前の何かを上書きすることに注意してください。

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

それに応じて編集しました-入力をありがとう!
ライアンタック

0

(間違いなく回復できるように)適切にゴミを捨てるのは、単にmvto よりも難しいです~/.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。これは、0日目からすべてのコンピューターでrmに使用するエイリアスであり、それが原因で問題が発生したことはありません。例を挙げてください。
user1256923

3
@OldPro:対話型シェルに.bashrcのみ使用されます。新しいプロセスを実行すると、プロセスが開始され、エイリアスはアクティブになりません。ただし、現在のプロセスを実行すると、インストーラーが実行され、エイリアスがアクティブになります。RTFM ..../install.sh. install.sh
マッキーメッサー

3
その後、インストーラーは対話型シェルを実行していたため、重大な問題が発生しました。1つの壊れたインストーラーだけでは、一般的なシェルエイリアスに対処するのに十分な理由にはなりません。YMMV
マッキーメッサー

1
ただし、morgantが言ったように、コマンドをエイリアス化しないことお勧めしrmます。rm実際にファイルを削除しないことに慣れると、そのようなエイリアスが追加されていないシステムで何かを誤って削除する可能性があるためです。また、ファイルをごみ箱に移動するのは簡単なことではありませんmv {} ~/.Trash。たとえば、ファイルが別のボリュームにある場合、これによりファイルがホームディレクトリにコピーされ、元のファイルが削除されます。
ジョシュ

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

?なぜ反対票?これも私の考えです
。.-いとこコカイン

おそらくの$*代わりにが必要に$1なりますが、そうすると同じ答えになりmv "$@" ~/.Trashます。なぜ人々が反対票を投じるのか、他の答えからのコメントをチェックしてください。
ケノーブ

このエイリアスには注意してください。これは、パーティションまたはドライブが1つしかない場合に機能します。2番目のボリュームまたはネットワーク共有で作業している場合、これは実際にファイルをホームディレクトリのゴミ箱にコピーします。
jmk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.