Используйте `ln`, чтобы создать отсутствующий каталог

10

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

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

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

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

Крис
источник
1
Возможно, я упускаю что-то очевидное, но почему вы не используете mkdir... для создания каталогов?
jw013
Вы также можете проверить lndir.
Ams

Ответы:

3

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

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

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

lynxlynxlynx
источник
Woops, я забыл упомянуть, что я пишу это на c ++ и связываю bash с вызовами system (), потому что это проще. Это то, что я закончил, хотя, спасибо.
Крис
@Chris: system()это не так просто, очень трудно правильно избежать аргументов командной строки system(). По крайней мере, вы должны использовать posix_spawn()или fork()+exec*(), который принимает аргументы командной строки в качестве массивов.
Ли Райан
4

Там нет флага, чтобы сделать это с ln. Создание каталогов это не его работа.

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

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

Жиль "ТАК - перестань быть злым"
источник
0

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

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

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

tar xvf links.tar
Владимир Ботка
источник