Сегодня я реализовал на Ruby ту же программу для копирования с пропусками, что ранее сделал на Tcl. На Ruby получилось следующее:
require 'find'
require 'fileutils'
#счётчики количества файлов и папок
file_count = 0
dir_count = 0
if(ARGV.size != 2)
puts "Script usage:"
puts "ruby no_svn_copy.rb source destination"
end
#получаем и нормализуем пути
src = File.expand_path(ARGV[0])
dst = File.expand_path(ARGV[1])
puts src + ' => ' + dst
#обрабатываем всё что есть в директории src
Find.find(src) do |path|
if(path.scan(".svn").size != 0)
next
end
#формируем путь к цели
filename = dst + path.gsub(src, '')
puts path
#если это директория, то создаём её в новом месте
if (FileTest.directory?(path))
dir_count += 1
FileUtils.mkdir_p filename
end
#если файл, то копируем его
if (FileTest.file?(path))
file_count += 1
FileUtils.cp path, filename
end
end
#выводим статистику
puts "dirs: " + dir_count.to_s +
" files: " + file_count.to_s
Основное отличие программы на Ruby от Tcl заключается в том, что я использовал возможности модуля Find, что позволило сразу получить список всех исходных файлов и папок, а затем обойти его в цикле, а не делать это самостоятельно с помощью рекурсии. Время выполнения в обоих случаях примерно одинаковое.
Комментариев нет:
Отправить комментарий