Symial aliasing файлы в подкаталогах без изменения текущего каталога

Похоже, что должно быть просто символизировать один файл в новый файл в подкаталоге …. …. без перемещения подкаталогов. Но что-то о синтаксисе вызывает недоумение и противоречит тому, что я ожидаю. Вот тестовый пример:

mkdir temp cd temp mkdir deploy echo "Contents of the build file!" > deploy/resources.build.php ln -s deploy/resources.build.php deploy/resources.php cat deploy/resources.php #bad symlink 

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

  • Хранение точечных файлов в синхронизации для разных папок
  • Symlink для части файла?
  • команда zip нескольких каталогов в отдельные файлы zip
  • Как удалить жесткую ссылку в каталог?
  • Символические ссылки с ls, mv: принуждение функций к использованию «логических» адресов (запоминание исходного пути)
  • Подстановочный файл Makefile $ соответствует только верхней директории
  •  ln -s deploy/resources.build.php resources.php cat deploy/resources.php 

    Также не работает, потому что он создает символическую ссылку в каталоге temp вместо подкаталога deploy.

     cd deploy ln -s resources.build.php resources.php cd .. 

    Это работает, но я бы предпочел знать, как это сделать, не меняя каталогов.

    Используя полный путь, например:

     /home/whatever/src/project/temp/stuff/temp/deploy/resources.build.php 

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

    Как создать символическую ссылку между двумя файлами в подкаталоге, не перемещаясь в этот подкаталог и из него, а при добавлении нового файла «псевдоним» – новое имя?

  • только показать исходный файл и целевой файл с помощью `ls`
  • Создание символических ссылок с подстановочными знаками
  • Как безопасно удалить каталог, не оставляя следа?
  • Как сделать символическую ссылку на / usr / bin / vim, но с параметрами запуска?
  • Может ли жесткая связь нарушить структуру файловой системы?
  • изменить владельца файла и его родительские каталоги
  • 2 Solutions collect form web for “Symial aliasing файлы в подкаталогах без изменения текущего каталога”

    Но что-то о синтаксисе вызывает недоумение и противоречит тому, что я ожидаю.

    Аргументы для ln в том виде, в котором вы его используете, следующие:

    ln [OPTION] … [-T] TARGET LINK_NAME (1-я форма)

    Удивительная, неинтуитивная вещь заключается в том, что при создании символической ссылки целевым аргументом для ln не считается путь к файлу, а скорее содержимое создаваемой символической ссылки. Если вы подумаете об этом на мгновение, очевидно, что это должно быть так. Рассматривать:

     $ echo foo >foo $ ln -s foo bar1 $ ln -s $PWD/foo bar2 $ cat bar1 foo $ cat bar2 foo $ ls -l bar1 bar2 lrwxrwxrwx 1 matt matt 3 Dec 29 16:29 bar1 -> foo lrwxrwxrwx 1 matt matt 29 Dec 29 16:29 bar2 -> /home/matt/testdir/foo 

    В этом примере я создаю две символические ссылки с именем «bar1» и «bar2», которые указывают на один и тот же файл. ls показывает, что сами символические ссылки имеют различное содержимое, хотя – один содержит абсолютный путь, а один содержит относительный путь. Из-за этого можно продолжать работать, даже если он перемещен в другой каталог, а другой не будет:

     $ mv bar2 /tmp $ cat /tmp/bar2 foo $ mv bar1 /tmp $ cat /tmp/bar1 cat: /tmp/bar1: No such file or directory 

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

    Если вы хотите создать файл с именем deploy / resources.php, который ссылается на deploy / resources.build.php, вам нужно решить, хотите ли вы создать абсолютную символическую ссылку (которая устойчива к перемещению символической ссылки, но ломается, если мишень перемещается) или относительная символьная ссылка (которая будет продолжать работать до тех пор, пока обе символическая ссылка и цель перемещаются вместе и сохраняют одни и те же относительные пути).

    Чтобы создать абсолютную символическую ссылку, вы можете:

     $ ln -s $PWD/deploy/resources.build.php deploy/resources.php 

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

     $ ln -s resources.build.php deploy/resources.php 

    Если они не находятся в одном каталоге, вам нужно будет сделать что-то вроде:

     $ ln -s ../foo/f bar/b 

    В этом случае, даже если foo и bar находятся в вашем текущем каталоге, вам нужно включить ../ в цель ln потому что он описывает, как найти f из каталога, содержащего b .

    Это очень длинное объяснение, но, надеюсь, это поможет вам лучше понять синтаксис ln .

    Вы можете создать ссылку в подоболочке следующим образом:

      (cd deploy && ln -s resources.build.php resources.php && cat resources.php) 

    Когда конец подоболочки завершится, вы окажетесь в правильном каталоге.

    Кроме того, вы можете попробовать

      ln -s resources.build.php deploy/resources.php 

    который также работает, пренебрегая включением в CL того факта, что файл resources.build.php отсутствует в каталоге, в котором вы выдаете команду, но на самом деле находится внутри ./deploy .

    Linux и Unix - лучшая ОС в мире.