C'è un modo per esprimere: `--link` o tornare alla copia ordinaria in cp (dai coreutils GNU)?


11

C'è un modo per dire cpa --link(cioè creare hard link), ma ripiegare nel caso in cui sto cercando hardlinks inter-device? I collegamenti tra dispositivi non sono possibili e potrebbero cpnon riuscire.

Il motivo che sto chiedendo è perché vorrei usarlo in a GNUmakefilee preferirei una riga di comando leggibile rispetto a una lunga e contorta (o una funzione, per quella materia).

La domanda è per GNU coreutils (7.4 e 8.13).

Nota: in questo momento la soluzione alternativa sarebbe simile a (GNU crea la sintassi della ricetta):

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

Questo ovviamente fornirà messaggi di errore spuri in caso di collegamenti tra dispositivi, sebbene riesca alla seconda cpchiamata. Inoltre, questo viene espanso (il modulo sorgente sembra dopo tutto leggibile) non sarà più troppo leggibile.

Risposte:


8

cpnon ha questa opzione. Potresti scrivere uno script wrapper, ma è piuttosto semplice.

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

GNU Coreutils 7.5 ha introdotto l' --reflinkopzione. Se si passa --reflink=autoe il file system sottostante supporta la copia su scrittura (ad es. Btrfs o ZFS) e la copia si trova sullo stesso dispositivo, quindi cpverrà creato un nuovo inode ma non verrà copiato il contenuto; altrimenti cpesegue una copia normale. Questo non è ancora un collegamento reale (l'obiettivo sarà sempre un inode diverso), ma probabilmente è anche meglio per il tuo caso d'uso. Tuttavia, se sei su ext4 (come la maggior parte delle persone al giorno d'oggi), che non supporta il copy-on-write, questo non ti aiuterà.


1
Grazie, il doppio $$nel mio caso è ovviamente perché si trova all'interno di una macro. E la tua linea ovviamente è una variazione di ciò che sto usando. Ma almeno so in questo modo che non esiste come opzione e che devo fornire il mio.
0xC0000022L

1
@ 0xC0000022L A proposito, tra qualche anno, quando btrfs soppianterà ext4, potresti voler usare scrap lne usare cp --reflink=auto(vedi la mia risposta aggiornata).
Gilles 'SO- smetti di essere malvagio' il

grazie, molto apprezzato Non ne ero a conoscenza, anche se avevo visto quell'opzione a un certo punto.
0xC0000022L
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.