Используйте `ln` для создания отсутствующего каталога

Используйте `ln` для создания отсутствующего каталога

Итак, я пишу небольшой менеджер пакетов и столкнулся с проблемой создания символических ссылок на файлы.

Он устанавливает пакет в /usr/pkg/name-version, а затем считывает файл, чтобы определить, какие символические ссылки нужно сделать. Я использую lnдля создания ссылок и столкнулся с проблемой при попытке установить заголовки Linux API. Мне нужно связать сами файлы заголовков, а не папки, которые их содержат (чтобы, если двум пакетам нужно поместить файлы в один и тот же подкаталог include, они могли бы это сделать, не испортив один пакет).

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

Есть ли флаг, lnкоторый создаст все отсутствующие каталоги, или мне придется использовать какой-то запутанный скрипт bash?

решение1

Нет флага, чтобы сделать это с ln. Создание каталогов не является его задачей.

mkdir -p foo/bar/quxсоздаст foo, foo/barи foo/bar/quxпо мере необходимости. Поэтому mkdir -pсначала вызовите все компоненты пути, кроме последнего.

Звучит так, будто вы изобретаете велосипед. Стоу, простой менеджер пакетов, который объединяет иерархии каталогов, создавая каталоги необходимой глубины с символическими ссылками на компоненты различных пакетов внутри. Или, возможно,XStow, который похож на Stow, но с большими возможностями настройки.

решение2

Вам не понадобится замысловатый bash-скрипт, а простой однострочный код, который mkdir --parentsобо всем позаботится, даже не выведя ошибку, если структура каталогов уже существует.

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

Кроме того, поскольку вы пишете это в bash, вы можете взглянуть наколдовство(бесстыдная реклама). Может быть, было бы проще просто изменить это, поскольку это зрелое и гибкое решение.

решение3

Возможно, tarвы могли бы помочь подготовить файл со ссылками:

find . -type l > links.txt
tar cpf links.tar --files-from links.txt

А затем создать ссылки там, где это необходимо:

tar xvf links.tar

Связанный контент