Есть ли способ выразить: `--link` или вернуться к обычному копированию в cp (из GNU coreutils)?

11

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

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

Вопрос для GNU coreutils (7.4 и 8.13).

Примечание: сейчас обходной путь будет выглядеть примерно так (GNU make recipe синтаксис):

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

Это, конечно, будет выдавать ложные сообщения об ошибках в случае соединений между устройствами, хотя в этом случае при втором cpвызове произойдет сбой . Кроме того, затем это расширяется (исходная форма выглядит читабельной в конце концов), он больше не будет слишком читабельным.

0xC0000022L
источник

Ответы:

8

cpне имеет этой опции. Вы можете написать скрипт-обертку, но это довольно просто.

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

В GNU Coreutils 7.5 появилась --reflinkопция. Если вы передадите, --reflink=autoи соответствующая файловая система будет поддерживать копирование при записи (например, Btrfs или ZFS), и копия окажется на том же устройстве, то cpсоздаст новый индекс, но не скопирует содержимое; в противном случае cpвыполняет обычную копию. Это все еще не жесткая ссылка (цель всегда будет другим индексом), но, вероятно, даже лучше для вашего варианта использования. Однако, если вы используете ext4 (как и большинство людей в настоящее время), который не поддерживает копирование при записи, это вам не поможет.

Жиль "ТАК - прекрати быть злым"
источник
1
Спасибо, двойной $$в моем случае, конечно, потому что это внутри макроса. И ваша линия, конечно, является вариацией того, что я использую. Но, по крайней мере, я знаю, что это не вариант, и мне нужно предоставить свой собственный.
0xC0000022L
1
@ 0xC0000022L Кстати, через несколько лет, когда btrfs вытеснит ext4, вы можете захотеть использовать лом lnи использовать cp --reflink=auto(см. Мой обновленный ответ).
Жиль "ТАК - перестань быть злым"
спасибо, высоко ценится. Не знал об этом, хотя я видел этот вариант в какой-то момент.
0xC0000022L