ファイル削除スクリプト

元ネタ.

越智崇クンがシェルスクリプトでしこしこ作ってるやつ.



最近, Ruby にあまり触れてないから, 組んでみた.
optparse をはじめて使ってみた. 便利や.
使うなら, 自分用に, $trash_path の値を書き換えなけりゃダメ.
わたしのホームディレクトリになってるから. ~/なんたら〜の指定で上手くいかなかったんだよね.

#!/usr/bin/env ruby

require 'optparse'

$trash_path = "/home/khiker/.Trash/"
# $trash_path = "./.Trash/"                    # ゴミ箱ディレクトリのパス

# ファイルをゴミ箱へ移動する関数.
def delete_main ( files )
  success = 0

  # ゴミ箱ディレクトリがあるかどうか.
  # 無ければ作成.
  unless File.exist?( $trash_path )
    Dir.mkdir( $trash_path )
  end

  # ファイルを移動.
  for arg in files
    if File.exist?( arg )
      File.rename( arg, $trash_path + File.expand_path( arg ).gsub( "/", "!") )
      success += 1
    else
      puts "File #{arg} not exists."
    end
  end

  puts "#{success}/#{files.length} succeeded."
end

# ファイルをゴミ箱から復活させる関数.
def recovery_main( files )
  success = 0

  unless File.exists?( $trash_path )
    puts "direcoty ${$trash_path} not exists."
    exit
  end

  # カレントディレクトリをゴミ箱ディレクトリにする.
  Dir.chdir( $trash_path )
  for arg in files
    basename = File.basename( arg )
    if File.exist?( basename )
      puts "recover #{arg} to #{basename.gsub( "!", "/")}"
      File.rename( basename, basename.gsub( "!", "/" ) )
      success += 1
    else
      puts "File #{basename} not exists."
    end
  end

  puts "#{success}/#{files.length} succeeded."
end

# 実行部
if $0 == __FILE__
  delete     = 0
  recovery   = 0
  Version    = "0.5.0"

  opt = OptionParser.new
  opt.on('-d', '--delete', 'ファイルをゴミ箱へ移動') { |v| delete = 1 }
  opt.on('-r', '--recovery', 'ファイルをゴミ箱から復活') { |v| recovery = 1 }
  opt.on('--trash [PATH]', 'ゴミ箱のパスを指定する.') { |v|
    $trash_path = v.to_s
    $trash_path += "/" unless $trash_path[$trash_path.length-1].chr == "/"
  }
  opt.parse!(ARGV)

  # 引数が何も与えられていない場合.
  if $*.length < 1
    puts opt.help
    puts "-d or -r is needed."
    puts "specify file or directory which the command deletes or recovers."
    exit
  end

  if delete == 1 && recovery == 0
    delete_main( $* )
  elsif delete == 0 && recovery == 1
    recovery_main( $* )
  else
    puts "-d and -r options can't coexist."
  end
end

__END__

ファイルをゴミ箱に移動する, または, ゴミ箱から復活する際,
移動先, もしくは, 復活先に同名のファイルがあっても, 一切警告しない.

同名ファイルがあったら, ~1とかファイル名の末尾につけてもよかったけど,
ほとんど無いだろうし,
そういうことするならバージョン管理システム使った方が良いだろうから,
実装するのやめた.
というか, ホントは, 面倒になってやめたんだけどね.


使い方.

$ ./trash.rb -d 削除するファイル1 削除するファイル2 ...
$ ./trash.rb -r 復元するファイル1 復元するファイル2 ...

ゴミ箱は, デフォルトでは, ~/.Trash ディレクトリ.
無かったら作る.
オプションで指定することも可能.
この例は, カレントディレクトリの .Trash ディレクトリを指す.
--trash 以下に指定したディレクトリに / が着いてなかったら, / を自動で追加するようにしてる.

$ ./trash.rb --trash .Trash

もっと現実的な使用例.
ここでは, ゴミ箱の場所を./.Trash として使用している.

$ ls
file.txt  sample.rb*  test/  test.rb*  trash.rb*  why.rb  xyz.sh  y_or_n.rb*
$ ./trash.rb -d file.txt why.rb xyz.sh
3/3 succeeded.
$ ls
sample.rb*  test/  test.rb*  trash.rb*  y_or_n.rb*

そして復元.

$ ./trash.rb -r ./.Trash/*
recover ./.Trash/!home!khiker!program!ruby!test!oti!file.txt to /home/khiker/program/ruby/test/oti/file.txt
recover ./.Trash/!home!khiker!program!ruby!test!oti!why.rb to /home/khiker/program/ruby/test/oti/why.rb
recover ./.Trash/!home!khiker!program!ruby!test!oti!xyz.sh to /home/khiker/program/ruby/test/oti/xyz.sh
3/3 succeeded.
$ ls
file.txt  sample.rb*  test/  test.rb*  trash.rb*  why.rb  xyz.sh  y_or_n.rb*

こんな感じ.
あんま試してないけど, ディレクトリでもたぶん大丈夫, かな?
ファイル(特にディレクトリ)を上書きする場合, 一度ファイル(ディレクトリ)を消してから作った方が良いかもなあ.

更新時刻

2007年, 3月6日, 19:11