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 

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

 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 

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

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

  • Как получить список всех «псевдонимов» файла (включая каталог типов) эффективно?
  • realpath -L vs -P
  • Как заменить символическую ссылку на эквивалентную жесткую ссылку?
  • Что делает $ 0 при вызове через символическую ссылку?
  • Трассировка маршрута символической ссылки
  • Где хранится информация о жестких / непрямых ссылках?
  • Как следовать символическим ссылкам в NFS?
  • Как разделить FHS только для чтения и читать / писать каталоги на двух дисках с помощью Linux / systemd, без разбиения диска raed / write?
  • 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 .

    Interesting Posts

    Ли Linux отключил питание устройств USB, которые потребляют слишком много энергии?

    Шаблоны оболочки и файлы точек

    / dev / console отсутствует при установке nfs

    Могу ли я изменить uuid для сетевого интерфейса в ifcfg-eth *, используя uuidgen?

    Сравнение двух файлов в unix и awk

    Управляйте приемником rs-232, как будто он понимает более свежий протокол IP

    Требует ли Posix каких-либо устройств?

    Реализация балансировки нагрузки FreeBSD

    Получать цвета в меньшей команде с помощью ccze: Shift + g не подходит к концу файла?

    Программное обеспечение для анализа журналов

    Легкий считыватель PDF, который может открывать несколько копий pdf с аннотациями и подсветкой

    Почему мой «d» сломался, когда я испортил привязку?

    Как найти базовые диски зеркального тома в LVM (linux)?

    Распечатайте результат ping в простом формате, таком как «10 мс»,

    (SSH) Опасно ли закрывать терминал без «выхода»?

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