cp: no sobrescribir en el archivo MAKE

3

En el archivo MAKE para mi proyecto, quiero que copie un archivo de configuración solo si el archivo aún no existe en la carpeta de destino. En este momento estoy usando:

cp -n

Sin embargo, recientemente alguien me ha dicho que está recibiendo un error de "opción no válida".

Mi pregunta es: para un archivo MAKE, ¿hay un método más compatible para lograr esto que cp -n?

(Nota: cp -u no es lo que quiero, si el archivo ya existe, nunca debería reemplazarse, incluso si es más antiguo que el archivo fuente).

SlappyTheFish
fuente
A quien haya votado para cerrar: Esto no está fuera de tema, es perfectamente válido aquí.
Wuffers

Respuestas:

2

Qué tal si:

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

Aún mejor, si este es, por ejemplo, un archivo de configuración que podría tener opciones nuevas y útiles, podría:

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

para que todavía tengan una copia a la que puedan referirse.

PriceChild
fuente
Esa es una gran idea sobre el archivo .new, lo usaré, ¡gracias!
SlappyTheFish
2

¿Creo que tus comandos de tu Makefile van a ser bash? Si es así, puede intentar usar bash si es condicional, eso depende de si el archivo existe:

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

Código Bash desde aquí .

En el caso de que descubra que el Makefile se está ejecutando en entornos en los que su contenido no se evalúa con respecto a bash, es posible que pueda usar rsync (debe instalarse en la mayoría de las máquinas unixy) para la operación de copia. Aunque solo miré a través de la página de manual y no vi una bandera para copiar solo si dest no existe, pero todavía creo que debe ser acomodado por rsync, solo tengo que encontrar la bandera deseada para usarlo.

James T Snell
fuente
1

Tuve el mismo problema en un Makefile. Extraño "cp -n" trabajó en el mismo shell. ¿Sería interesante saber por qué?

Esta es mi solución, un poco más corta que si fuera otra cosa

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