Mac で CLI から「ゴミ箱に入れる」をやってみる

特に理由はないんだけど、MacOS のターミナルからファイルを「ゴミ箱に入れる」というのをやってみたかった。普通の rm コマンドではゴミ箱に入らずそのまま消えてしまうので、Finder でゴミ箱に捨てるようなことをやってみたい。

ファイルゴミ箱に入れる

AppleScript (osascript) を使ってこんな風に書けば良い。

$ osascript -e 'tell application "Finder"
  move POSIX file "/Users/PATH/TO/FILE.txt" to trash
end tell
'

ファイルパスは相対パスだとダメで、フルパスじゃないといけない。1行で書くならこうなる。

$ osascript -e 'tell application "Finder" to move POSIX file "/Users/PATH/TO/FILE.txt" to trash'
document file FILE.txt of folder .Trash of folder 【USER】 of folder Users of startup disk

削除できましたよーというメッセージが出るので、> /dev/null 2>&1 を付けて標準出力を握り潰しておくと良いかと。

ゴミ箱を空にする

ついでに、ターミナルからゴミ箱を空にする方法。

$ osascript -e 'tell application "Finder" to empty trash'

ワンライナーでやるなら上のように書けば良いのだけど、ゴミ箱が空の状態でこのコマンドを打つと以下のエラーが出る。

29:40: execution error: Finderでエラーが起きました: 操作を完了できません。 (-128)

> /dev/null 2>&1 で握り潰しても良いけど、以下のように「ゴミ箱にファイルがあれば削除する」という風に書いてやると丁寧かと。

$ osascript -e 'tell application "Finder"
  set trashCount to count of items in the trash
  if trashCount > 0 then
    empty the trash
  end if
end tell'

AppleScript は1行にまとめる時に end ステートメントが要らなくなったり、to で繋いだりするあたりの文法が良く分かってない。osascript -l JavaScript とすると JavaScript っぽい文法 (JXA) で書けるっぽいのだけど、それにしても良く分からん。w

既にクロスプラットフォームでツール化してくれてるよ

色々調べてたら、npm パッケージを作りまくってる Sindre Sorhus 氏による、Mac・Windows・Linux 対応の CLI ツールが既に公開されていた。他にも類似ツールはたくさんあるんだけど、ココ最近でコンスタントに開発メンテが期待できるのは Sindre Sorhus 氏のツールかな〜。

npm 製なので次のようにグローバルインストールする。

$ npm install --global trash-cli empty-trash-cli

# ファイルやディレクトリを捨てる
$ trash ./HOGE/

# ゴミ箱を空にする
$ empty-trash

alias rm='trash' という風にエイリアス化しても良さそうだ。-rf とかのオプションは無視されて、ディレクトリでも自動的にゴミ箱に入る。

ソースを追いかけると中々面白くて、当然ながら OS ごとに条件分岐している。Mac では AppleScript を使ったり Swift でコードを書いてバイナリ化してあったり。Windows も専用の API を叩く C++ のコードが exe 化されていて、Node.js の皮を被ったバイナリアプリだったりする。w

パッケージが大量に別れてて、一見すると「一つにまとめたら?」と思うが、個別に開発したモノを繋ぎ合わせて一つのツールになっていく様が UNIX 哲学っぽいし、依存関係がハッキリ別れるので個々のソースが短くて読みやすい。