Hatena::ブログ(Diary)

実験と娯楽

2012-04-03

ファイル名の一括置換

目的

ディレクトリ内のファイル名から数字だけを抜き出して、「数字.拡張子」にリネームしたい。

正規表現を扱えるリネームソフトを探してみたけど、後方参照できなかったりマルチバイト使えなかったりしてめんどい!

方針

Rubyで書くか・・・

解法
#rename.rb

path = ARGV[0]
Dir::glob(path.to_s + "*").each do |f|
  a = f.gsub(/(.+)\/.*?(\d+).*?\.(.+)$/u, '\1/\2.\3')
  File.rename(f, a)
  p f + " -> " + a
end
使用例
$ ruby rename.rb /path/to/dir/
#=> "/path/to/dir/あああ01あああ.jpg" -> "/path/to/dir/01.jpg"
感想

よろしいんじゃないでしょうか。

2008-07-04

Array#each_sliceほしい

配列からx個ずつ要素を取り出してブロックに渡したい!

class Array	
  def each_slice(l = 1)
    i = 0
    while i < size
      a = slice(i,l)
      yield a
      i += l
    end
  end
end

(1..10).to_a.each_slice(3){ |s| p s }

=> [1,2,3]
   [4,5,6]
   [7,8,9]
   [10]

こういうやつ。例えば列数を指定したtableタグとかが書きやすくなる。

<table>
<% @items.each_slice(3) do |s| %>
  <tr>
  <% for item in s %>
    <td><%= item.name %></td>
  <% end %>
  </tr>
<% end %>
</table>

どうでしょう。

追記:ていうか既にあった!あほか!

2008-07-03

比較演算と論理和

すっごい初歩的なつまずきだと思うんですが。

def hoge(x)
  x == "a" || x == "b" || x == "c"
end

みたいな、複数の候補のどれかと一致したらtrueを返す式の書きかたがわからない。上の例だとなんかキモいじゃないですか。候補を配列にすれば

def hoge(x)
  ["a","b","c"].include?(x)
end

こうも書けるけど、演算子だけでもっとシンプルに書けないのでしょうか。