回答
在紅寶石:
Dir['**/*'] \
.select { |d| File.directory? d } \
.select { |d| (Dir.entries(d) - %w[ . .. ]).empty? } \
.each { |d| Dir.rmdir d }
你能解釋第3行中的「 - 」嗎? – 2009-08-17 22:03:37
我正在減去包含字符串的數組「。」和「..」,因爲每個目錄都包含這兩個特殊條目。 – kch 2009-08-17 22:03:48
另外,你能解釋一下「\」是什麼嗎?續行?他們需要嗎? – 2009-08-17 22:05:21
爲什麼不使用shell?
找到。 -type d -empty -exec rmdir'{}'\;
完全是你想要的。
我希望得到一個ruby腳本版本來幫助你理解文件的工作。我可以從一個rake腳本中用'sh
腳本命令將完全相同。不過,下面的帖子有一個適合你的答案。 – koenigdmj 2009-08-17 22:10:00
Dir.glob('**/*').each do |dir|
begin
Dir.rmdir dir if File.directory?(dir)
# rescue # this can be dangereous unless used cautiously
rescue Errno::ENOTEMPTY
end
end
我測試過的OS X這個腳本,但如果你使用的是Windows,你需要做出改變。
您可以使用Dir#條目找到包含隱藏文件的目錄中的文件。
此代碼將刪除刪除任何子目錄後變爲空的目錄。
def entries(dir)
Dir.entries(dir) - [".", ".."]
end
def recursively_delete_empty(dir)
subdirs = entries(dir).map { |f| File.join(dir, f) }.select { |f| File.directory? f }
subdirs.each do |subdir|
recursively_delete_empty subdir
end
if entries(dir).empty?
puts "deleting #{dir}"
Dir.rmdir dir
end
end
module MyExtensions
module FileUtils
# Gracefully delete dirs that are empty (or contain empty children).
def rmdir_empty(*dirs)
dirs.each do |dir|
begin
ndel = Dir.glob("#{dir}/**/", File::FNM_DOTMATCH).count do |d|
begin; Dir.rmdir d; rescue SystemCallError; end
end
end while ndel > 0
end
end
end
module ::FileUtils
extend FileUtils
end
end
Dir['/Users/path/Movies/incompleteAnime/foom/**/*']. \
select { |d| File.directory? d }. \
sort.reverse. \
each {|d| Dir.rmdir(d) if Dir.entries(d).size == 2}
就像第一個例子,但第一個例子似乎並沒有處理遞歸位。排序和反向確保我們首先處理最嵌套的目錄。
我想sort.reverse可以寫成sort {|a,b| b <=> a}
效率
你必須按相反的順序進行刪除,否則如果你有一個子目錄吧,你會刪除欄空目錄foo的,但不是foo。
Dir.glob(dir + "/**/*").select { |d|
File.directory?(d)
}.reverse_each { |d|
if ((Dir.entries(d) - %w[ . .. ]).empty?)
Dir.rmdir(d)
end
}
查看來自kch,dB的例子。毗溼奴及以上,我已經把一個班輪,我認爲是一個更優雅的解決方案:
Dir['**/'].reverse_each { |d| Dir.rmdir d if Dir.entries(d).size == 2 }
我用'**/'
,而不是'/**/*'
的水珠,它僅返回目錄,所以我沒有以後再測試它是否是一個目錄。根據post,我使用的是reverse_each
而不是sort.reverse.each
,因爲它更短並且效率更高。我更喜歡到(Dir.entries(d) - %w[ . .. ]).empty?
,因爲它更容易閱讀和理解,但如果必須在Windows上運行腳本,(Dir.entries(d) - %w[ . .. ]).empty?
可能會更好。
我已經在Mac OS X上對此進行了相當多的測試,即使使用遞歸空目錄,它也能正常工作。
- 1. 如何刪除一個目錄遞歸
- 2. emacs遞歸刪除目錄?
- 3. 遞歸刪除目錄
- 4. 遞歸地刪除目錄
- 5. 遞歸刪除目錄
- 6. Ruby遞歸目錄
- 7. 如何在Python中查找遞歸空目錄?
- 8. 消除遞歸刪除空目錄算法
- 9. 遞歸刪除樹目錄結構中的空項目
- 10. 查找名爲「歸檔」和刪除文件的目錄
- 11. 延遲時刪除目錄遞歸
- 12. 遞歸刪除目錄用C
- 13. 如何遞歸刪除空對象?
- 14. 在C++中通過遞歸查找目錄和子目錄
- 15. Ruby刪除目錄
- 16. CMD:我如何遞歸刪除「隱藏」 - 文件和目錄的屬性
- 17. 如何查找和刪除空文件?
- 18. 以遞歸方式查找空文件夾並遞歸刪除它們
- 19. PHP使用SPL迭代器遞歸刪除空目錄
- 20. 如何遞歸移除目錄?
- 21. 查找並刪除空文件夾遞歸沒有「-empty」參數
- 22. PHP的 - 如何遞歸刪除數組的空條目?
- 23. 如何遞歸刪除以「xxxxx」開頭的目錄?
- 24. 如何使用Perl遞歸刪除所有.svn目錄?
- 25. 刪除Unix中的遞歸目錄(無限子目錄)
- 26. 如何刪除左遞歸
- 27. 如何刪除遞歸?
- 28. 爲什麼我有遞歸刪除目錄的問題?
- 29. 刪除目錄,如果空
- 30. 在C中遞歸刪除文件和目錄#
首先想到的是:系統「find。-type d | xargs rmdir -p 2>/dev/null」 – kch 2009-08-17 21:53:27
只需要注意,我不想在命令行中一次性執行此操作。它將成爲一個紅寶石腳本。你上面的是一個cmd行版本no? – 2009-08-17 21:55:07
好吧,這是一個shell命令,是的,但是使用'Kernel.system'從ruby中調用;) – kch 2009-08-17 22:02:25