4

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

cp -n

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

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

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

3 ответа3

2

Как насчет:

#!/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

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

2

Я думаю, что ваши команды из вашего 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, просто нужно найти предполагаемый флаг, чтобы использовать его.

1

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

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

test -e folder/requirements.txt || cp -p ../requirements.txt folder/requirements.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .