ごみ箱スクリプト

Windowsのファイル削除と違って、rm(1)はファイルをごみ箱に送らずに削除してしまう。で、この挙動で痛い目にあった人は、ごみ箱もどきを実装したスクリプトでよく胡麻化している。ウン百個目の車輪か分からないけど、僕もRubyで実装してみた。
ファイル名: saferm

#!/usr/bin/env ruby
# -*- ruby -*-
# $Id: saferm,v 1.1 2005/05/25 15:09:25 s-tanaka Exp $
#

def run(cmd, *args)
  pid = fork do 
    exec(cmd, *args)
  end
  Process.waitpid(pid)
end

trash = ENV['HOME']
trash += '/' if trash[-1] != ?/
trash += Time.now.strftime('.trash/%Y%m%d')

endoptflag = false
ARGV.each do |arg|
  unless endoptflag
    case arg
    when '--'
      endoptflag = true
      next
    when /^-/
      next
    end
  end
  endoptflag = true
  run('/bin/mkdir', '-p', trash)
  run('/bin/mv', '-f', '--', arg, trash)
end

以下のようにrmコマンドにaliasしておくと便利。

alias rm=saferm

他のスクリプトとの差別化ポイントとしては、コマンドのオプションを「適当に」読み飛ばしてくれる。例えば、saferm -rf fileの場合、file以下を全てごみ箱に移動する。saferm -- -fileの場合、-file以下を全てごみ箱に移動する。いつものrmの癖でオプションを付けても適当に扱ってくれる。
BUS。rm(1)とmv(1)の違いにまつわる細かい挙動の違いがいっぱい。