Apakah ada cara untuk mengekspresikan: `--link` atau kembali ke salinan biasa dalam cp (dari GNU coreutils)?

11

Apakah ada cara untuk memberitahu cpke --link(yaitu membuat link keras), tetapi jatuh kembali dalam kasus di mana saya mencoba hardlinks antar-perangkat? Tautan antar-perangkat tidak memungkinkan dan akan menyebabkan cpkegagalan.

Alasan saya bertanya adalah karena saya ingin menggunakan ini dalam GNUmakefiledan lebih suka baris perintah yang dapat dibaca daripada yang berbelit-belit dan panjang (atau fungsi, dalam hal ini).

Pertanyaannya adalah untuk GNU coreutils (7.4 dan 8.13).

Catatan: saat ini solusinya akan seperti (sintaks resep resep GNU):

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

Ini tentu saja akan memberikan pesan kesalahan palsu jika terjadi tautan antar-perangkat, meskipun kemudian berhasil pada cppanggilan kedua . Juga, maka ini akan diperluas (bentuk sumber terlihat dapat dibaca setelah semua) itu tidak akan terlalu dibaca lagi.

0xC0000022L
sumber

Jawaban:

8

cptidak memiliki opsi ini. Anda bisa menulis skrip pembungkus, tetapi cukup sederhana.

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

GNU Coreutils 7.5 memperkenalkan --reflinkopsi. Jika Anda lulus --reflink=autodan sistem file yang mendasari mendukung copy-on-write (misalnya Btrfs atau ZFS) dan salinan kebetulan berada pada perangkat yang sama, maka cpakan membuat inode baru tetapi tidak menyalin konten; jika tidak, cplakukan salinan normal. Ini masih bukan tautan keras (target akan selalu berupa inode yang berbeda), tetapi mungkin bahkan lebih baik untuk kasus penggunaan Anda. Namun, jika Anda menggunakan ext4 (seperti kebanyakan orang saat ini), yang tidak mendukung copy-on-write, ini tidak akan membantu Anda.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Terima kasih, dobel $$dalam kasus saya tentu saja karena ini ada di dalam makro. Dan baris Anda tentu saja adalah variasi dari apa yang saya gunakan. Tapi setidaknya saya tahu dengan cara ini bahwa itu tidak ada sebagai pilihan dan saya harus menyediakan sendiri.
0xC0000022L
1
@ 0xC0000022L Ngomong-ngomong, dalam beberapa tahun, ketika btrfs supplants ext4, Anda mungkin ingin menggunakan memo lndan menggunakan cp --reflink=auto(lihat jawaban saya yang diperbarui).
Gilles 'SO- stop being evil'
terima kasih banyak. Tidak menyadarinya, meskipun saya telah melihat opsi itu di beberapa titik.
0xC0000022L