ファイル削除スクリプト
元ネタ.
越智崇クンがシェルスクリプトでしこしこ作ってるやつ.
最近, 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