В настоящее время я использую обычную технику в моем Makefile для установки отдельных файлов:
install:
install -D executable ${BIN_DIR}
Но я просто столкнулся с ситуацией, когда мне нужно переместить весь каталог и все файлы под ним на место.
cp -r - лучший способ или есть более Linux-y / unix-y способ сделать это?
"cp -r" - новая школа, и у нее не так много хороших функций, как у команды install. Я пытаюсь придерживаться обычных соглашений, которые можно увидеть в файлах Makefile, но этого я не видел.
Дело в том, что установка нет очень портативна и не очень безопасна, например, в среде ACL.





Да, трудно придумать более unix-стиль, чем cp -r, хотя -r - относительно позднее добавление к cp. Я могу рассказать вам, как мы это делаем, использовал, и который аккуратно работает с файловыми системами и т. д.:
Пусть src будет исходным каталогом, который вы хотите переместить, а /path/to/target будет абсолютным путем к цели. Тогда вы можете использовать:
$ tar cf - src | (cd /path/to/target; tar xf -)
Найдите старшеклассника, добавив тире перед флагами tar (1) :) Я до сих пор часто использую этот метод. Но вам, определенно, нужен && (not;) в вашей подоболочке. Если / path / to / target не существует, вы можете получить некоторые ... интересные ... результаты.
Вы абсолютно правы. Знаешь, я не уверен, что && сработало, когда я впервые научился этому трюку.
Мне нравится оператор && ... Я бы также ожидал проверки в другом месте сценария, чтобы увидеть, существует ли каталог, и создать его в противном случае, и выйти, если создание не удастся.
О, я согласен. Я просто не думаю, что оболочка Борна сделала это, когда я выучил эту идиому еще во времена каменных ножей.
@CharlieMartin Что там делает смола? Приводит ли это к более быстрому копированию, чем (cp -r)? Или это просто для достижения той же цели, когда (cp -r) еще не существовало?
В cp долгое время не было рекурсивной опции. Когда я начал использовать UNIX, использование этого конвейера tar было разумным способом Только. Что, по общему признанию, было в триасе.
@CharlieMartin, я не уверен, когда вы изучили эту технику, но правильно ли я предполагаю, что она предшествует добавлению опции -C,--directory в BSD и / или GNU tar? Я спрашиваю только потому, что предпочитаю -C /path/to/target, а не подоболочку с ведущим cd /path/to/target.
Черт побери, это вполне могло быть до ты. Я почти уверен, что научился этому в 1983 году, и тогда это был давний пример «посмотрите, что вы можете сделать с трубками».
В моей версии 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 является механизмом распространения, я бы предположил, что он пытается быть таким кроссплатформенность насколько это возможно.
Вы знаете, как сделать это рекурсивно?
Связывание - еще одна жизнеспособная альтернатива. Это позволит вам поддерживать доступ к нескольким каталогам (представляющим разные версии).
К сожалению, я не могу предположить, что они сохранят извлеченный tar.gz после завершения установки, поэтому все это нужно переместить.
вы можете рассмотреть возможность жесткой привязки (которая позволит обойти проблему с удалением исходных файлов), однако, если цель находится в другой файловой системе / разделе, чем источник, жесткая ссылка не удастся.
Я никогда не видел никого, кто думал, что cp не unixy