传入文件扩展名变量

时间:2011-10-19 17:54:12

标签: ruby

我正在尝试将文件扩展名作为变量传递,但它似乎不起作用。当我运行getlist.rb(txt)

def getlist(extension)
  file = File.new("the_list.txt", "w")
  Dir['../path/*.'+ extension].each { |f| file.puts File.basename(f, '.'+ extension).upcase }
end

基本上我想放入任何文件扩展名(txt,pdf,rb等),它会给我一个没有扩展名的列表。脚本在硬编码时工作正常,当我尝试放入变量时,它不起作用。

最诚挚的问候,

AZCards

2 个答案:

答案 0 :(得分:0)

Dir['../path/*.'+ extension].each { |f| file.puts File.basename(f, File.extname(f)).upcase }

也就是说,在使用原始字符串连接时,它对我来说也很好:

ruby-1.9.2-p0 :035 > getlist("html")
 => ["./about.html", "./epl-v10.html", "./notice.html"] 
ruby-1.9.2-p0 :037 > getlist("*")
 => ["./libcairo-swt.so", "./eclipse.ini", "./icon.xpm", "./eclipse.ini~", "./about.html", "./epl-v10.html", "./artifacts.xml", "./notice.html"] 
ruby-1.9.2-p0 :038 > getlist("ini")
 => ["./eclipse.ini"] 

(为了空间目的,删除没有删除扩展名,但是它们以扩展名打印,大写。)

答案 1 :(得分:0)

我的例子:

def getlist(extension)
  File.open("the_list.txt", "w"){|file|
    Dir["*.#{extension}"].each { |f| 
        file << File.basename(f, File.extname(f)).upcase
        file << "\n"
    }
  }
end

getlist('rb')
getlist(:rb)

我的主要修改:

  • File.open isnted new(你忘记了file.close)。使用File.open和一个块,自动完成关闭。
  • 用#-replacements替换String +。优点:你可以在调用符号时使用符号(你写了getlist.rb(txt) - 这只适用,当txt是一个变量,但我认为你想'txt')
  • 使用File#extension。,请参阅Daves answer。
  • 我在结果文件中添加了换行符。

<强>更新 以防您需要具有多个扩展的解决方案并从命令行调用它:

def getlist(*extensions)
  p "*.{#{extensions.join(',')}}"
  File.open("the_list.txt", "w"){|file|
    Dir["*.{#{extensions.join(',')}}"].each { |f| 
        file << File.basename(f, File.extname(f)).upcase
        file << "\n"
    }
  }
end

#getlist('rb', 'txt')
#getlist(:rb, :txt)
getlist(*ARGV)