2015-06-18 139 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)作爲拒絕標準的一部分。

相關問題