Ruby干净脚本

时间:2014-10-12 20:14:42

标签: ruby bash

我是Ruby的新手。 我正在尝试编写一个删除所有已编译文件的脚本。 例如,我有源文件和目标文件以及一些中间文件。 我需要保留源文件和目标文件。基本文件名是未知的,但是如果有的话 file.c所有其他文件都有'file'basename,因此会有file.s,file.o和file

我认为我能做的就是找一个'foo.c',如果它存在,删除除目标文件之外的所有'低'文件。如果没有foo.c文件,那么我正在寻找foo.s文件,并删除所有其他文件等。

所以我想我会使用Dir.entries来获取文件夹中所有文件名的数组

如果使用bash脚本更容易,我会很高兴听到任何建议

我试过

Dir.entries(".").each do filename
puts filename
end

我可以从中获取文件扩展名,我可以检查它是否是.s或.c,但是如果没有.c存在我不想删除.s文件

这是我目前的代码:

Dir.entries(".").each do |filename|
if File.extname(filename) == ".c"
   name = File.basename(filename, ".c")
   if File.exists?(name + ".s")
      File.delete(name + ".s")
   end
   ...
end
...
end

1 个答案:

答案 0 :(得分:0)

files_with_same_names = Dir.glob('*').group_by { |file| File.basename(file, '.*') } # this way we group files with the same base name

files_with_same_names.each_pair do |base_name, files_with_same_basename|
  extensions = ['.c', '.s'] # put the #1 priority extension first, the #2 priorty second etc.

  extensions.each do |extension|
    full_name = "#{base_name}#{extension}"
    if files_with_same_basename.include?(full_name)
      files_with_same_basename.delete(full_name) # delete the top-level name from our array
      files_with_same_basename.each do |file| # and delete the rest of the files
        puts "Deleting #{file}"# Replace puts "Deleting #{file}" with File.delete(file)
      end
    end
  end

我已经使用这些文件对其进行了测试: 交流转换器 广告 b.s b.h B.O

它即将删除" a.d" (因为它找到了a.c)和b.h和b.o(因为它找到了b.s而不是b.c)。