我试图根据给定路径中包含的所有目录中的模式删除文件。我有以下但它就像一个无限循环。当我取消循环时,不会删除任何文件。我哪里错了?
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$/)
答案 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。