Рекурсивный узорный файл Удалить в Ruby/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$/)
Ответы
Ответ 1
Вам не нужно повторно использовать это колесо. Рекурсивный файловый глобус уже является частью основной библиотеки.
Dir.glob('C:\Test_Directory\**\*.cs').each { |f| File.delete(f) }
Dir # glob перечисляет файлы в каталоге и может принимать подстановочные знаки. **
- супер-подстановочный знак, который означает "сопоставить что-нибудь, включая целые деревья каталогов", поэтому он будет соответствовать любому уровню глубины (в том числе "без" уровней: .cs
файлы в C:\Test_Directory
сами будут также соответствовать с помощью образец, который я поставил).
@kkurian указывает (в комментариях), что File#delete
может принимать список, поэтому это может быть упрощено:
File.delete(*Dir.glob('C:\Test_Directory\**\*.cs'))
Ответ 2
Поскольку вы используете Rake уже, вы можете использовать удобный FileList
объект. Например:
require 'rubygems'
require 'rake'
FileList['c:/Test_Directory/**/*.cs'].each {|x| File.delete(x)}
Ответ 3
еще один ярлык 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"]
Ответ 4
Поскольку вы используете 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")
Вы можете увидеть определение этих задач в исходном коде здесь.