¿Hay alguna forma de expresar: `--link` o recurrir a la copia ordinaria en cp (desde GNU coreutils)?

11

¿Hay una manera de decirle cpa --link(es decir, crear enlaces duros), pero caer de nuevo en el caso en que estoy tratando de enlaces duros entre dispositivos? Los enlaces entre dispositivos no son posibles y causarían cpfallas.

La razón por la que pregunto es porque me gustaría usar esto en GNUmakefileay preferiría una línea de comando legible sobre una enrevesada y larga (o una función, para el caso).

La pregunta es para los coreutils de GNU (7.4 y 8.13).

Nota: en este momento, la solución sería algo así como (GNU make sintaxis de receta):

cp -fl $^ $@ || cp -f $^ $@

Por supuesto, esto dará mensajes de error espurios en el caso de enlaces entre dispositivos, aunque tendrá éxito en la segunda cpllamada. Además, esto se expande (el formulario fuente parece legible después de todo) ya no será legible.

0xC0000022L
fuente

Respuestas:

8

cpNo tiene esta opción. Podrías escribir un script de envoltura, pero es bastante simple.

ln -f $^ $@ 2>/dev/null || cp -f $^ $@

GNU Coreutils 7.5 introdujo la --reflinkopción. Si aprueba --reflink=autoy el sistema de archivos subyacente admite copia en escritura (por ejemplo, Btrfs o ZFS) y la copia está en el mismo dispositivo, cpcreará un nuevo inodo pero no copiará el contenido; de lo contrario cprealiza una copia normal. Esto todavía no es un enlace duro (el objetivo siempre será un inodo diferente), pero probablemente sea aún mejor para su caso de uso. Sin embargo, si está en ext4 (como la mayoría de las personas hoy en día), que no admite copia en escritura, esto no lo ayudará.

Gilles 'SO- deja de ser malvado'
fuente
1
Gracias, el doble $$en mi caso es, por supuesto, porque está dentro de una macro. Y su línea, por supuesto, es una variación de lo que estoy usando. Pero al menos sé de esta manera que no existe como una opción y necesito proporcionar la mía.
0xC0000022L
1
@ 0xC0000022L Por cierto, en unos años, cuando btrfs suplante ext4, es posible que desee usar chatarra lny usar cp --reflink=auto(vea mi respuesta actualizada).
Gilles 'SO- deja de ser malvado'
Gracias, de verdad. No lo sabía, aunque había visto esa opción en algún momento.
0xC0000022L