Ruby / Rake中的递归图案文件删除

时间:2011-10-05 21:48:40

标签: ruby recursion rake

我试图根据给定路径中包含的所有目录中的模式删除文件。我有以下但它就像一个无限循环。当我取消循环时,不会删除任何文件。我哪里错了?

def recursive_delete (dirPath, pattern)
    if (defined? dirPath and  defined? pattern && File.exists?(dirPath))
        stack = [dirPath]

        while !stack.empty?
            current = stack.delete_at(0)
            Dir.foreach(current) do |file|
                if File.directory?(file)
                    stack << current+file
                else
                    File.delete(dirPath + file) if (pattern).match(file)
                end
            end
        end

    end
end

# to call:
recursive_delete("c:\Test_Directory\", /^*.cs$/)

4 个答案:

答案 0 :(得分:33)

您无需重新实施此滚轮。递归文件glob已经是核心库的一部分。

Dir.glob('C:\Test_Directory\**\*.cs').each { |f| File.delete(f) }

Dir#glob列出目录中的文件,并且可以接受通配符。 **是一个超级通配符,表示“匹配任何内容,包括整个目录树”,因此它会匹配任何级别的深层(包括.cs中的“无”级别C:\Test_Directory文件本身也将使用我提供的模式匹配。

@kkurian指出(在评论中){​​{1}}可以接受列表,因此可以简化为:

File#delete

答案 1 :(得分:12)

由于您已经使用了Rake,因此您可以使用方便的FileList对象。例如:

require 'rubygems'
require 'rake'

FileList['c:/Test_Directory/**/*.cs'].each {|x| File.delete(x)}

答案 2 :(得分:11)

另一个ruby one liner快捷方式,使用FileUtils递归删除目录下的文件

FileUtils.rm Dir.glob("c:/temp/**/*.so")

更短:

FileUtils.rm Dir["c:/temp/**/*.so"]

另一个复杂的用法:多个模式(不同目录中的多个扩展名)。警告您不能使用Dir.glob()

FileUtils.rm Dir["c:/temp/**/*.so","c:/temp1/**/*.txt","d:/temp2/**/*.so"] 

答案 3 :(得分:0)

由于您使用的是Rake,因此我将使用clean任务删除文件:

require 'rake/clean'
outfiles = Rake::FileList.new("**/*.out")
CLEAN << outfiles

现在,如果您运行rake -T,将会看到我们有一个clean和一个clobber任务。

rake clean    # Remove any temporary products
rake clobber  # Remove any generated files

如果运行rake clean,它将删除所有扩展名为.out的文件。

使用这种方法,您可以选择删除临时文件或生成的文件。使用任务clobber删除生成的文件,如下所示:

CLOBBER << Rake::FileList.new("**/*.gen")

您可以看到这些任务的定义on the source code here