Подтвердить что ты не робот

Рекурсивный узорный файл Удалить в 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$/)
4b9b3361

Ответ 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")

Вы можете увидеть определение этих задач в исходном коде здесь.