Gibt es eine Möglichkeit, Folgendes auszudrücken: `--link` oder auf eine normale Kopie in cp (von GNU coreutils) zurückzugreifen?

11

Gibt es eine Möglichkeit, dies cpzu erkennen --link(dh Hardlinks zu erstellen), aber in dem Fall, in dem ich versuche, Hardlinks zwischen Geräten zu verwenden, zurückzugreifen? Geräteübergreifende Verbindungen sind nicht möglich und würden cpzum Fehlschlagen führen.

Der Grund, den ich frage, ist, dass ich dies in einer verwenden GNUmakefilemöchte und eine lesbare Befehlszeile einer verschlungenen und langwierigen (oder einer Funktion) vorziehen würde.

Die Frage betrifft GNU-Coreutils (7.4 und 8.13).

Hinweis: Im Moment wäre die Problemumgehung ungefähr so ​​(GNU-Rezept-Syntax erstellen):

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

Dies führt natürlich zu falschen Fehlermeldungen bei Verbindungen zwischen Geräten, obwohl dies beim zweiten cpAufruf erfolgreich ist. Außerdem wird dies dann erweitert (das Quellformular sieht schließlich lesbar aus) und es wird nicht mehr zu lesbar sein.

0xC0000022L
quelle

Antworten:

8

cphat diese Option nicht. Sie könnten ein Wrapper-Skript schreiben, aber es ist ziemlich einfach.

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

GNU Coreutils 7.5 führte die --reflinkOption ein. Wenn Sie übergeben --reflink=autound das zugrunde liegende Dateisystem Copy-on-Write (z. B. Btrfs oder ZFS) unterstützt und sich die Kopie zufällig auf demselben Gerät befindet, cpwird ein neuer Inode erstellt, der Inhalt jedoch nicht kopiert. Andernfalls wird cpeine normale Kopie ausgeführt. Dies ist immer noch keine feste Verbindung (das Ziel wird immer eine andere Inode sein), aber es ist wahrscheinlich noch besser für Ihren Anwendungsfall. Wenn Sie jedoch auf ext4 arbeiten (wie die meisten Leute heutzutage), das Copy-on-Write nicht unterstützt, hilft Ihnen dies nicht weiter.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Danke, das Doppelte $$in meinem Fall ist natürlich, weil dies in einem Makro ist. Und Ihre Linie ist natürlich eine Variation dessen, was ich benutze. Aber zumindest weiß ich auf diese Weise, dass es keine Option gibt und ich meine eigenen bereitstellen muss.
0xC0000022L
1
@ 0xC0000022L Übrigens, in einigen Jahren, wenn btrfs ext4 ersetzt, möchten Sie möglicherweise Schrott lnund Verwendung verwenden cp --reflink=auto(siehe meine aktualisierte Antwort).
Gilles 'SO - hör auf böse zu sein'
Danke, freut mich sehr. War mir dessen nicht bewusst, obwohl ich diese Option irgendwann gesehen hatte.
0xC0000022L