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
を付けて標準出力を握り潰しておくと良いかと。
- 参考 : applescript, move folder and its contents to trash - Stack Overflow
- 参考 : AppleScriptで使える技6つ - Qiita
ゴミ箱を空にする
ついでに、ターミナルからゴミ箱を空にする方法。
$ 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
- sindresorhus/trash-cli: Move files and folders to the trash
- sindresorhus/empty-trash-cli: Empty the trash
- sindresorhus/empty-trash: Empty the trash
- sindresorhus/empty-recycle-bin: Empty the Windows recycle bin
- empty-trash/index.js at main · sindresorhus/empty-trash … MacOS の「ゴミ箱を空にする」は、前述の AppleScript を JXA (JS 風味の記法) で書いて実行している
パッケージが大量に別れてて、一見すると「一つにまとめたら?」と思うが、個別に開発したモノを繋ぎ合わせて一つのツールになっていく様が UNIX 哲学っぽいし、依存関係がハッキリ別れるので個々のソースが短くて読みやすい。