Копировать каталог с символическими ссылками, указывающими на скопированные файлы (внутри дерева каталогов) - PullRequest
2 голосов
/ 12 марта 2012

Я хочу скопировать папку и все ее содержимое, включая подпапки. Я использую C на Ubuntu.

Копирование обычных файлов и папок до сих пор легко и делается, но спецификации для копирования ссылок (пока что символические) таковы, что они должны ссылаться на скопированные файлы. На данный момент меня интересуют только ссылки внутри дерева каталогов.

(Хотя ссылки вне дерева, я думаю, должно быть проще - просто скопируйте полный путь к новой ссылке и выясните, принадлежат ли они в дереве или нет - это сложно, хотя sarnold дал мне совет об использовании rsync для достижения этой цели)

Итак, у меня есть абсолютный путь, возвращаемый readlink:

/home/giorgos/Desktop/folder/folder1/a.pdf

Что в худшем случае будет:

/home/giorgos/Desktop/folder/folder/folder/folder1/a.pdf

но я не могу найти способ получить относительный путь к моему дереву каталогов. Если бы я мог найти его, я мог бы заменить его на имя скопированного каталога:

 /home/giorgos/Desktop/March/folder/myfolder/folder/folder1/a.pdf

Я не могу использовать функцию cp или system () или функции такого рода, решение должно быть низкого уровня. Я могу использовать библиотеки c и GNU, но, пожалуйста, оставьте ответ, если мне интересно.

1 Ответ

0 голосов
/ 27 апреля 2012

Предположим, что вам нужно скопировать каталог SRC_DIR в DST_DIR, оба из которых являются абсолютными путями (если нет, вы можете легко конвертировать их, используя getcwd) .

Этот псевдокод должен охватывать все возможности (вероятно, он предполагает многократное использование strtok для токенизации путей в разделителях '/'):

if (SRC_DIR/SUBDIRS/LINK is a symlink that points to TARGET_LOCATION)
  {
    // TARGET_LOCATION may be relative *or* absolute. Make it absolute:
    if (TARGET_LOCATION does not begin with '/')
      {
        prepend SRC_DIR/ to it
      }
    if (TARGET_LOCATION contains a subdirectory named '..')
      {
        replace occurances of 'SOMEDIRNAME/..' with ''
      }
    if (TARGET_LOCATION contains a subdirectory named '.')
      {
        replace occurances of '/.' with ''
      }
    // now TARGET_LOCATION is an absolute path

    if (TARGET_LOCATION does not begin with SRC_DIR)
      {
        // symlink points outside tree
        create symlink DST_DIR/SUBDIRS/LINK pointing to TARGET_LOCATION
      }
    else
      {
        // symlink points inside tree
        strip SRC_DIR from beginning of TARGET_LOCATION
        prepend DST_DIR to TARGET_LOCATION
        create symlink DST_DIR/SUBDIRS/LINK pointing to TARGET_LOCATION
      }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...