Удаление рекурсивных шаблонных файлов в Ruby / Rake - PullRequest
13 голосов
/ 06 октября 2011

Я пытаюсь удалить файлы на основе шаблона из всех каталогов, содержащихся в данном пути. У меня есть следующее, но это действует как бесконечный цикл. Когда я отменяю из цикла, никакие файлы не удаляются. Куда я иду не так?

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$/)

Ответы [ 3 ]

33 голосов
/ 06 октября 2011

Вам не нужно повторно реализовывать это колесо.Рекурсивный глобус файла уже является частью базовой библиотеки.

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'))
12 голосов
/ 06 октября 2011

Поскольку вы уже используете Rake, вы можете использовать удобный объект FileList. Например:

require 'rubygems'
require 'rake'

FileList['c:/Test_Directory/**/*.cs'].each {|x| File.delete(x)}
11 голосов
/ 31 января 2013

другой рубиновый ярлык с одним вкладышем, использующий 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"] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...