cp - не перезаписывать в make-файле

В make-файле для моего проекта я хочу, чтобы он копировал файл конфигурации, только если файл еще не существует в папке назначения. На данный момент я использую:

cp -n

Однако недавно кто-то сказал мне, что они получают сообщение об ошибке "Недопустимая опция".

Мой вопрос: для make-файла, есть ли более совместимый метод для достижения этой цели, чем cp -n?

(Примечание: cp -u - это не то, что мне нужно, если файл уже существует, его никогда не следует заменять, даже если он старше исходного файла.)

3 ответа

Решение

Как насчет:

#!/bin/bash
if ! [ -e /path/to/foo ]
then
    cp foo /path/to/
fi

Еще лучше, если это, например, файл конфигурации, который может иметь новые полезные опции, которые вы можете:

#!/bin/bash
if ! [ -e /path/to/foo ]
then
    cp foo /path/to/
else
    cp -f foo /path/to/foo.new
fi

так что у них все еще есть копия, к которой они могут обратиться.

Я думаю, что ваши команды из вашего Makefile просто будут bash? Если это так, вы можете попробовать использовать команду bash, если она зависит от того, существует ли файл:

if [ -f $FILE ];
then
   #echo "File $FILE exists"
else
   #echo "File $FILE does not exists"
   cp $SRC_FILE $FILE
fi

Код Bash отсюда.

В случае, если вы обнаружите, что Makefile запускается в средах, где их содержимое не сравнивается с bash, вы можете использовать rsync (должен быть установлен на большинстве машин Unixy) для операции копирования. Хотя я просто просмотрел справочную страницу и не увидел флажок для копирования, только если dest не существует - но я все еще думаю, что это должно быть предусмотрено rsync, просто нужно найти соответствующий флаг, чтобы использовать его.

У меня была такая же проблема в Makefile. Странный "cp -n" работал в той же оболочке. Было бы интересно узнать почему?!

Это мое решение, немного сократить, чем если бы тогда еще

test -e folder/requirements.txt || cp -p ../requirements.txt folder/requirements.txt
Другие вопросы по тегам