Czy istnieje sposób na wyrażenie: `--link` lub powrót do zwykłej kopii w cp (z GNU coreutils)?

11

Czy istnieje sposób, aby powiedzieć cpdo --link(tj tworzyć dowiązania twarde), ale spadek z powrotem w przypadku gdy ja próbuje hardlinki między urządzeniami? Łącza między urządzeniami nie są możliwe i mogą spowodować cpawarię.

Powodem, dla którego pytam, jest to, że chciałbym użyć tego w a GNUmakefilei wolałbym czytelny wiersz poleceń niż jakiś skomplikowany i długi (lub funkcję, jeśli o to chodzi).

Pytanie dotyczy jąder GNU (7.4 i 8.13).

Uwaga: w tej chwili obejście może wyglądać następująco (składnia receptury GNU):

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

Będzie to oczywiście dawać fałszywe komunikaty o błędach w przypadku łączy między urządzeniami, chociaż wówczas powiodą się przy drugim cpwywołaniu. Również wtedy to się rozszerza (mimo wszystko forma źródłowa wygląda na czytelną), nie będzie już zbyt czytelne.

0xC0000022L
źródło

Odpowiedzi:

8

cpnie ma tej opcji. Możesz napisać skrypt opakowania, ale jest to dość proste.

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

GNU Coreutils 7.5 wprowadził tę --reflinkopcję. Jeśli zdasz, --reflink=autoa bazowy system plików obsługuje kopiowanie przy zapisie (np. Btrfs lub ZFS), a kopia znajduje się na tym samym urządzeniu, cputworzy nowy i-węzeł, ale nie skopiuje zawartości; w przeciwnym razie cpwykonuje normalną kopię. To wciąż nie jest twardy link (celem zawsze będzie inny i-węzeł), ale prawdopodobnie jest jeszcze lepszy w twoim przypadku użycia. Jeśli jednak korzystasz z ext4 (jak obecnie większość ludzi), który nie obsługuje kopiowania przy zapisie, to ci nie pomoże.

Gilles „SO- przestań być zły”
źródło
1
Dzięki, podwójne $$w moim przypadku jest oczywiście, ponieważ jest w makrze. Twoja linia jest oczywiście odmianą tego, czego używam. Ale przynajmniej wiem w ten sposób, że nie istnieje jako opcja i muszę podać własne.
0xC0000022L
1
@ 0xC0000022L Nawiasem mówiąc, za kilka lat, kiedy btrfs zastąpi ext4, możesz chcieć używać złomu lni używać cp --reflink=auto(zobacz moją zaktualizowaną odpowiedź).
Gilles „SO- przestań być zły”
dziękuję, bardzo mile widziane. Nie byłam tego świadoma, chociaż w pewnym momencie widziałam tę opcję.
0xC0000022L