Как скопировать структуру каталогов в ruby, исключая определенные расширения файлов - PullRequest
5 голосов
/ 02 апреля 2009

Я хочу написать скрипт ruby, чтобы рекурсивно копировать структуру каталогов, но исключать определенные типы файлов. Итак, учитывая следующую структуру каталогов:

folder1
  folder2
    file1.txt
    file2.txt
    file3.cs
    file4.html
  folder2
  folder3
    file4.dll

Я хочу скопировать эту структуру, но за исключением файлов .txt и .cs . Итак, результирующая структура каталогов должна выглядеть так:

folder1
  folder2
    file4.html
  folder2
  folder3
    file4.dll

Ответы [ 3 ]

9 голосов
/ 02 апреля 2009

Вы можете использовать модуль find . Вот фрагмент кода:


require "find"

ignored_extensions = [".cs",".txt"]

Find.find(path_to_directory) do |file|
  # the name of the current file is in the variable file
  # you have to test it to see if it's a dir or a file using File.directory?
  # and you can get the extension using File.extname

  # this skips over the .cs and .txt files
  next if ignored_extensions.include?(File.extname(file))
  # insert logic to handle other type of files here
  # if the file is a directory, you have to create on your destination dir
  # and if it's a regular file, you just copy it.
end
2 голосов
/ 02 апреля 2009

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

пример:

Dir.glob( File.join('.', '**', '*')).reject {|filename| File.extname(filename)== '.cs' }.each {|filename| do_copy_operation filename destination}

В этом примере Glob возвращает перечисляемую коллекцию имен файлов (включая каталоги). Вы исключаете ненужные элементы в фильтре отбраковки. Затем вы реализуете метод, который принимает имя файла и место назначения для копирования.

Вы можете использовать метод массива include? также в блоке отклонения в соответствии с примером поиска из Geo.

Dir.glob( File.join('.', '**', '*')).reject {|file| ['.cs','.txt'].include?(File.extname(file)) }
0 голосов
/ 03 апреля 2009

Может быть, использовать некоторые сценарии оболочки?

files = `find | grep -v "\.\(txt\|cs\)$"`.split
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...