1

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

Это я уже могу сделать, используя:

cp -sR /home/me/SourceDir TargetDir

Тем не менее, я хотел бы, чтобы любые относительные символические ссылки в SourceDir, которые указывают где-то еще в SourceDir, оставались такими же относительными ссылками, следовательно, теперь они указывают на TargetDir.

Например, скажем, SourceDir содержит следующее:

File0
Dir1/File1
Dir1/File2
Dir2/File3
Dir2/File2   <-- this is a symlink to ../Dir1/File2

Тогда я бы хотел, чтобы TargetDir выглядел так:

File0        <-- symlink to  ../SourceDir/File0
Dir1/File1   <-- symlink to  ../../SourceDir/Dir1/File1
Dir1/File2   <-- symlink to  ../../SourceDir/Dir1/File2
Dir2/File3   <-- symlink to  ../../SourceDir/Dir2/File3
Dir2/File2   <-- this is still a symlink to ../Dir1/File2, so: TargetDir/Dir1/File2

Я не возражал бы, если бы это нужно было выполнить за два или три шага (что-то, что я мог бы написать в простом сценарии оболочки).

Одна мысль, которая у меня возникла, - сначала скопировать только все символические ссылки, а затем выполнить cp -sR без использования clobber.

1 ответ1

2

Вы не сказали, что находитесь в /home/me , но ваша команда cp создаст все ваши ссылки как абсолютные, где бы вы ни находились, т.е. TargetDir/File0 -> /home/me/SourceDir/File0 т.д., А не относительные ссылки, которые вы иллюстрировать.

Вы можете достичь того, чего хотите, используя find:-

cp -sR /home/me/SourceDir TargetDir
cd /home/me/SourceDir
find -type l -exec cp -P "{}" "/Path/To/TargetDir/{}" \;
  • Первая команда - ваш оригинал.
  • Позиционируя себя в исходном каталоге, вы исключаете его из пути поиска.
  • find с помощью cp -P перезаписывает ссылки дословными копиями исходных ссылок.
  • Двойные кавычки допускают файлы и каталоги со встроенными пробелами.

Если вы действительно хотите относительные ссылки (TargetDir/File0 -> ../../SourceDir/File0 т.д.) Для ваших обычных файлов вам нужно будет использовать find -type f и выполнить mkdir -p для создания целевой структуры каталогов, затем find -type f и выполнить ls -s для каждого файла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .