Чи є спосіб виразити: `--link` або повернутися до звичайної копії в cp (від GNU coreutils)?


11

Чи є спосіб , щоб сказати , cpщоб --link(тобто створювати жорсткі посилання), але падати назад в тому випадку , коли я намагаюся жорсткі посилання між пристроями? Посилання між пристроями неможливі і можуть спричинити cpзбій.

Причина, про яку я запитую, полягає в тому, що я хотів би використовувати це в a, GNUmakefileі я вважаю за краще читати командний рядок над деяким звивистим і тривалим (або з цього приводу функцією).

Питання стосується GNU coreutils (7.4 та 8.13).

Зауважте: зараз вирішення буде чимось на зразок (GNU make recept syntax):

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

Це, звичайно, дасть помилкові повідомлення про помилки у випадку посилань між пристроями, хоча успішно працює на другому cpдзвінку. Крім того, тоді ця розширюється (форма джерела все-таки виглядає читабельною) вона вже не буде занадто читаною.

Відповіді:


8

cpне має цієї опції. Можна написати сценарій обгортки, але це досить просто.

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

GNU Coreutils 7.5 ввів цю --reflinkопцію. Якщо ви передаєте, --reflink=autoі базова файлова система підтримує копіювання під час запису (наприклад, Btrfs або ZFS), і копія знаходиться на тому ж пристрої, тоді cpбуде створено новий inode, але не копіюється вміст; інакше cpвиконує звичайну копію. Це все ще не є важким зв’язком (ціль завжди буде іншим inode), але це, мабуть, навіть краще для вашого випадку використання. Однак якщо ви перебуваєте на ext4 (як і більшість людей у ​​наш час), який не підтримує копіювати при записі, це не допоможе вам.


1
Дякую, $$в моєму випадку дубль, звичайно, тому що це всередині макросу. І ваша лінія звичайно є варіацією того, що я використовую. Але принаймні я знаю таким чином, що він не існує як варіант, і мені потрібно надати своє.
0xC0000022L

1
@ 0xC0000022L До речі, через кілька років, коли btrfs витіснить ext4, ви, можливо, захочете використовувати брухт lnта використовувати cp --reflink=auto(див. Мою оновлену відповідь).
Жил "ТАК - перестань бути злим"

дякую, дуже вдячний. Не знав про це, хоча я бачив такий варіант в якийсь момент.
0xC0000022L
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.