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
В случае, если вы обнаружите, что Makefile запускается в средах, где их содержимое не сравнивается с bash, вы можете использовать rsync (должен быть установлен на большинстве машин Unixy) для операции копирования. Хотя я просто просмотрел справочную страницу и не увидел флажок для копирования, только если dest не существует - но я все еще думаю, что это должно быть предусмотрено rsync, просто нужно найти соответствующий флаг, чтобы использовать его.
У меня была такая же проблема в Makefile. Странный "cp -n" работал в той же оболочке. Было бы интересно узнать почему?!
Это мое решение, немного сократить, чем если бы тогда еще
test -e folder/requirements.txt || cp -p ../requirements.txt folder/requirements.txt