Книга: Программирование на языке Ruby

14.8.2. Копирование дерева каталогов (с символическими ссылками)

14.8.2. Копирование дерева каталогов (с символическими ссылками)

Пусть нужно скопировать целое дерево каталогов в новое место. Сделать это можно по-разному, но если в дереве есть символические ссылки, задача усложняется.

В листинге 14.5 приведено рекурсивное решение. Оно достаточно дружелюбно — контролирует входные данные и выводит информацию о порядке запуска.

Листинг 14.5. Копирование дерева каталогов

require "fileutils"
def recurse(src, dst)
 Dir.mkdir(dst)
 Dir.foreach(src) do |e|
  # Пропустить . и ..
  next if [".",".."].include? e
  fullname = src + "/" + e
  newname = fullname.sub(Regexp.new(Regexp.escape(src)),dst)
  if FileTest:rdirectory?(fullname)
   recurse(fullname,newname)
  elsif FileTest::symlink?(fullname)
   linkname = 'ls -l #{fullname}'.sub(/.* -> /,"").chomp
   newlink = linkname.dup
   n = newlink.index($oldname)
   next if n == nil
   n2 = n + $oldname.length - 1
   newlink[n..n2] = $newname
   newlink.sub!(////,"/")
   # newlink = linkname.sub(Regexp.new(Regexp.escape(src)),dst)
   File.symlink(newlink, newname)
  elsif FileTest::file?(fullname)
   FileUtils.copy(fullname, newname)
  else
   puts "??? : #{fullname}"
  end
 end
end
# "Главная программа"
if ARGV.size != 2
 puts "Usage: copytree oldname newname"
 exit
end
oldname = ARGV[0]
newname = ARGV[1]
if ! FileTest::directory?(oldname)
 puts "Ошибка: первый параметр должен быть именем существующего каталога."
 exit
end
if FileTest::exist? (newname)
 puts "Ошибка: #{newname} уже существует."
 exit
end
oldname = File.expand_path(oldname)
newname = File.expand_path(newname)
$оldname=oldname
$newname=newname
recurse(oldname, newname)

Возможно, и существуют варианты UNIX, в которых команда cp -R сохраняет символические ссылки, но нам о них ничего не известно. Программа, показанная в листинге 14.5, была написана для решения этой практической задачи.

Оглавление книги


Генерация: 1.259. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз