Как лучше всего переместить каталог на место при установке Makefile?

В настоящее время я использую обычную технику в моем Makefile для установки отдельных файлов:

install:
    install -D executable ${BIN_DIR}

Но я просто столкнулся с ситуацией, когда мне нужно переместить весь каталог и все файлы под ним на место.

cp -r - лучший способ или есть более Linux-y / unix-y способ сделать это?

Я никогда не видел никого, кто думал, что cp не unixy

dsm 06.01.2009 19:43

"cp -r" - новая школа, и у нее не так много хороших функций, как у команды install. Я пытаюсь придерживаться обычных соглашений, которые можно увидеть в файлах Makefile, но этого я не видел.

Lolindrath 06.01.2009 20:25

Дело в том, что установка нет очень портативна и не очень безопасна, например, в среде ACL.

Charlie Martin 07.01.2009 04:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
3
5 266
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Да, трудно придумать более unix-стиль, чем cp -r, хотя -r - относительно позднее добавление к cp. Я могу рассказать вам, как мы это делаем, использовал, и который аккуратно работает с файловыми системами и т. д.:

Пусть src будет исходным каталогом, который вы хотите переместить, а /path/to/target будет абсолютным путем к цели. Тогда вы можете использовать:

$ tar cf - src | (cd /path/to/target; tar xf -)

Найдите старшеклассника, добавив тире перед флагами tar (1) :) Я до сих пор часто использую этот метод. Но вам, определенно, нужен && (not;) в вашей подоболочке. Если / path / to / target не существует, вы можете получить некоторые ... интересные ... результаты.

Martin Carpenter 06.01.2009 20:05

Вы абсолютно правы. Знаешь, я не уверен, что && сработало, когда я впервые научился этому трюку.

Charlie Martin 06.01.2009 22:49

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

saschabeaumont 07.01.2009 03:23

О, я согласен. Я просто не думаю, что оболочка Борна сделала это, когда я выучил эту идиому еще во времена каменных ножей.

Charlie Martin 07.01.2009 04:28

@CharlieMartin Что там делает смола? Приводит ли это к более быстрому копированию, чем (cp -r)? Или это просто для достижения той же цели, когда (cp -r) еще не существовало?

dtmland 08.07.2015 22:38

В cp долгое время не было рекурсивной опции. Когда я начал использовать UNIX, использование этого конвейера tar было разумным способом Только. Что, по общему признанию, было в триасе.

Charlie Martin 09.07.2015 02:00

@CharlieMartin, я не уверен, когда вы изучили эту технику, но правильно ли я предполагаю, что она предшествует добавлению опции -C,--directory в BSD и / или GNU tar? Я спрашиваю только потому, что предпочитаю -C /path/to/target, а не подоболочку с ведущим cd /path/to/target.

rubicks 06.01.2018 18:34

Черт побери, это вполне могло быть до ты. Я почти уверен, что научился этому в 1983 году, и тогда это был давний пример «посмотрите, что вы можете сделать с трубками».

Charlie Martin 07.01.2018 19:37

В моей версии install(1) (Debian) есть:

   -d, --directory
          treat all arguments as directory names; create all components of the specified directories

   -t, --target-directory=DIRECTORY
          copy all SOURCE arguments into DIRECTORY

Итак, если вы хотите последовательно использовать install(1) в своем Makefile, вы можете:

install -d destdir
install srcdir/* -t destdir

Однако -t не рекурсивен - если srcdir содержит каталоги, они не будут скопированы.

это будет очень зависеть от версии установки, которая находится в целевой системе, это было бы подходящим при установке на известную ОС (например, debian), но если tgz является механизмом распространения, я бы предположил, что он пытается быть таким кроссплатформенность насколько это возможно.

saschabeaumont 07.01.2009 03:22

Вы знаете, как сделать это рекурсивно?

Pipo 13.12.2018 16:26

Связывание - еще одна жизнеспособная альтернатива. Это позволит вам поддерживать доступ к нескольким каталогам (представляющим разные версии).

К сожалению, я не могу предположить, что они сохранят извлеченный tar.gz после завершения установки, поэтому все это нужно переместить.

Lolindrath 06.01.2009 21:02

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

saschabeaumont 07.01.2009 03:21

Другие вопросы по теме