2011-02-17

コマンドラインからゴミ箱に捨てるシェルスクリプト

Mac OS X 用のゴミ箱スクリプトは検索すれば結構出てくるものの、どれもファイルを直接 ~/.Trash 等に移動するものが多いような気がする。
外付け HDD の場合はゴミ箱のパスが違うし、移動先に同じファイル名がある場合の処理とか、結構面倒くさい。

面倒くさいので全部 Finder に丸投げ、ということで AppleScript 経由でゴミ箱に捨てるスクリプトがこちら。

Finder で「ゴミ箱に入れる」
trash
#!/bin/sh

# Trash items.
# Usage: trash [files]

# Backslashes and doublequotes must be escaped.
# replace  \  -->  \\
# replace  "  -->  \"
CWD=`pwd | sed -E -e 's/\\\\/\\\\\\\\/g' -e 's/"/\\\\"/g'`

osascript - "$@" <<EOF
on run argv
    set itemArray to {}

    repeat with i in argv
        if first character of i is not "/" then
            set i to "$CWD" & "/" & i
        end if
        set itemArray to itemArray & (i as POSIX file as Unicode text)
    end repeat

    tell application "Finder"
        delete itemArray
    end tell
end run
EOF

動作確認:Mac OS X 10.6 (osascript の引数処理の関係で Mac OS X 10.4 以上が必要と思われます。)

使う場合、実行権限を付けて PATH の通った所へファイルを置いてください。
使い方の例: hoge.txt fuga.txt を捨てる
trash hoge.txt fuga.txt

AppleScript を使う利点としては、このスクリプトでゴミ箱に捨てた直後ならば、 Finder で「取り消す Cmd-Z」ができる。 Mac OS X 10.6 からはゴミ箱内の項目を「戻す」ことができるので、それにも対応している。欠点としては動作が遅い。


以下はおまけの Finder で「オリジナルを表示」と「情報を見る」のスクリプト。

Finder で「オリジナルを表示」
reveal
#!/bin/sh

# Reveal in Finder.
# Usage: reveal [files]

CWD=`pwd | sed -E -e 's/\\\\/\\\\\\\\/g' -e 's/"/\\\\"/g'`

osascript - "$@" <<EOF
on run argv
    set itemArray to {}

    repeat with i in argv
        if first character of i is not "/" then
            set i to "$CWD" & "/" & i
        end if
        set itemArray to itemArray & (i as POSIX file as Unicode text)
    end repeat

    tell application "Finder"
        activate
        reveal itemArray
    end tell
end run
EOF

Finder で「情報を見る」
getinfo
#!/bin/sh

# Show information window in Finder.
# Usage: getinfo [files]

CWD=`pwd | sed -E -e 's/\\\\/\\\\\\\\/g' -e 's/"/\\\\"/g'`

osascript - "$@" <<EOF
on run argv
    repeat with i in argv
        if first character of i is not "/" then
            set i to "$CWD" & "/" & i
        end if
        set i to (i as POSIX file as Unicode text)

        tell application "Finder"
            open information window of item i
        end tell
    end repeat

    tell application "Finder"
        activate
    end tell
end run
EOF

Emacs の Dired からゴミ箱に捨てる方法はこちら。 Dired からゴミ箱に捨てる、情報を見る、 Finder で表示