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.

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.