2015-06-18 141 views
0

我正在寻找一种方式,子目录删除文件,无论深度也不断档不删除的排除列表。如何删除子目录中的文件和文件夹,但跳过删除Ruby中的某些文件名?

排除列表= [my.file]

给定文件夹结构(文件夹与/结束)

one/ 
    my.file 
    two/ 
    x.x 
    x.x 
    xxx/ 
     xx 
     my.file 
    xxxx/ 
     xx 

后删除(每一个文件被删除不在排除列表,如果没有子文件夹被删除)

one/ 
    my.file 
    two/ 
    xxx/ 
     my.file 

我一直USI NG此到目前为止,但不会低于第一级

inside(directory) do 
     FileUtils.rm_rf Dir.glob('*').reject { |f| whitelist.include?(f) } 
    end 
+0

欢迎来到Stack Overflow。在你说你不想递归删除的注释中,你想*选择性地*删除,而这听起来像你只想删除那些缺少.gitignore文件的目录。如果是这样,请更新您的问题以包含真实需求。因为你的问题与你所说的要求不符,这对那些试图帮助你的人来说是一种误导和沮丧。 –

+0

我的不好,对不起,虽然我把拒绝电话留在命令中让它更清楚一点。我会更新。 – user391986

+0

一些思考是是否使用'Dir.glob( '**/*')'或趁['Find.find'](http://ruby-doc.org/stdlib-2.2.2 /libdoc/find/rdoc/Find.html)方法。在一个复杂的目录结构中,第一个可能需要很长时间才能运行,因为它会通过构建入口数组,然后将其保存在内存中。使用'Find.find'将立即开始处理,并递归下降,将您遇到的目录和文件名一一递交给您。它效率高得多,但写得更复杂一点。我建议使用Find.find。 –

回答

3

FilUtils remove_dir递归删除。

require "fileutils" 
FileUtils.remove_dir("the_dir") 

尽管没有软弱的白名单 - 一切都消失了。

+0

如何让它忽略递归删除中的所有.gitignore文件? – user391986

+0

我不认为用合理的方式使用'remove_dir'是可能的。但是,Git是一个强大的工具和SO的流行标签,所以也许一个改编的,更加以Git为导向的问题是成功的。 – steenslag

1

尝试:

inside(directory) do 
    FileUtils.rm_rf Dir.glob('**/*').reject { |f| whitelist.include?(File.basename(f)) } 
end 

虽然可以删除目录以及。在这种情况下,使用File.directory?(f)作为拒绝标准的一部分。

相关问题