2012-05-25 19 views
6

私は自分自身のプログラミングの練習として、ルビーに基づいたファイルリネームプログラムを試しています(私はlinuxの名前を変更していますが、Rubyを学びたいと思います。 Macでは使用できません)。ルビーのファイルの名前を変更する方法

以下のコードから、ファイル名にそのような検索パターンが含まれていても、.include?メソッドは常にfalseを返すという問題があります。 include?チェックをコメントアウトすると、gsub()は新しいファイル名を生成していないようです(つまり、ファイル名は同じです)。誰かが私が間違ったことを見てみることができますか?事前に束をありがとう!ここで

が期待される動作です:Rubyスクリプトは、b1.jpgにB2を、それを名前を変更することができるはずA1.JPG、a2.jpg、およびa3.jpg : は、現在のフォルダに三つのファイルがあると仮定すると。 JPG、b3.jpg

#!/Users/Antony/.rvm/rubies/ruby-1.9.3-p194/bin/ruby 

puts "Enter the file search query" 
searchPattern = gets 
puts "Enter the target to replace" 
target = gets 
puts "Enter the new target name" 
newTarget = gets 
Dir.glob("./*").sort.each do |entry| 
    origin = File.basename(entry, File.extname(entry)) 
    if origin.include?(searchPattern) 
    newEntry = origin.gsub(target, newTarget) 
    File.rename(origin, newEntry) 
    puts "Rename from " + origin + " to " + newEntry 
    end 
end 
+0

次の3つの 'gets'プロンプトにどのような入力を提供していますか? – bta

+0

私は真剣に 'rename'コマンドがもっとうまくいくと思っています... – texasbruce

+0

@texasbruce、macにはrenameコマンドがありません。多分macportsは何かを持っていますが、perlスクリプトの束しか見つけませんでした。しかし、私が以前に示唆したように、それは私にとってはルビーのエクササイズです – Antony

答えて

9

少し変更したバージョン:

puts "Enter the file search query" 
searchPattern = gets.strip 
puts "Enter the target to replace" 
target = gets.strip 
puts "Enter the new target name" 
newTarget = gets.strip 
Dir.glob(searchPattern).sort.each do |entry| 
    if File.basename(entry, File.extname(entry)).include?(target) 
    newEntry = entry.gsub(target, newTarget) 
    File.rename(entry, newEntry) 
    puts "Rename from " + entry + " to " + newEntry 
    end 
end 

主な違い:

  • を使用して、getsから取得する末尾改行を削除します。そうしないと、この改行文字はすべての試合の試合を混乱させます。
  • glob呼び出しでユーザー提供の検索パターンを使用し、すべてをグロビングする代わりに手動で後でフィルタリングします。
  • originの代わりにgsubrenameの呼び出しでentry(つまり完全なファイル名)を使用します。 originは実際に.include?テストにのみ役立ちます。ファイル名の断片なので、renameでは使用できません。私はorigin変数を完全に削除して、誤って使用する誘惑を避けました。
  • あなたの例のフォルダ構造については

*.jpgaを入力すると、あなたが期待しているとして3つの入力のプロンプト(それぞれ)のためのbは、ファイルの名前を変更する必要があります。

+0

ああ!説明ありがとう。少なくともドキュメント(ruby-doc.org)からは、ストリップ(先頭と末尾の空白が削除されている)とchomp(改行が削除されている)が表示されているようです。gets.chomp.stripで終わってしまいました。うまくいけば。とにかくスクリプトは完璧に動作します! – Antony

+0

@ Antony-改行はRubyが "空白"とみなすものの一部なので、 'chomp'と' strip'の両方を行うことは冗長です。 'strip'は' chomp'が行うすべてのことを行います。 – bta

2

あなたの問題はgetsは、文字列の末尾に改行を返すということです。したがって、「foo」と入力すると、searchPattern"foo\n"になります。最も簡単な修正は次のとおりです。

searchPattern = gets.chomp 

私は少しあなたのコードを書き換えることがあります

$stdout.sync 
print "Enter the file search query: "; search = gets.chomp 
print "Enter the target to replace: "; target = gets.chomp 
print " Enter the new target name: "; replace = gets.chomp 
Dir['*'].each do |file| 
    # Skip directories 
    next unless File.file?(file) 
    old_name = File.basename(file,'.*') 
    if old_name.include?(search) 
    # Are you sure you want gsub here, and not sub? 
    # Don't use `old_name` here, it doesn't have the extension 
    new_name = File.basename(file).gsub(target,replace) 
    File.rename(file, new_path) 
    puts "Renamed #{file} to #{new_name}" if $DEBUG 
    end 
end 
+0

chompを指摘していただきありがとうございます。毎日何か新しいことを学ぶ。 – Antony

+0

File.renameに送る引数 "new_path"はどこに設定されていますか?おそらく、あなたはFile.rename(file、new_name)を意味していたでしょうか?さもなければ、私はこれを与えるだろう+1 – emery

3

私は、受け入れられた答えを使用して、コピーされたファイルの名前の束を修正しました。

Dir.glob('./*').sort.each do |entry| 
    if File.basename(entry).include?(' copy') 
    newEntry = entry.gsub(' copy', '') 
    File.rename(entry, newEntry) 
    end 
end 
0

ここで私は(パターンマッチングなし)現在使用されてきたショートバージョンだ

保存するには、このrename.rbファイルなどとルビーリネームして、コマンドプロンプト内でそれを実行します。RB

count = 1 
newname = "car" 
Dir["/path/to/folder/*"].each do |old| 
    File.rename(old, newname + count.to_s) 
    count += 1 
end 

私は、_MG_2435.JPGの/コピー、CAR1へのCaR2を変換していた...

関連する問題