Saya ingin membuat "salinan" dari pohon direktori di mana setiap file adalah hardlink ke file asli
Contoh: Saya memiliki struktur direktori:
dirA/
dirA/file1
dirA/x/
dirA/x/file2
dirA/y/
dirA/y/file3
Ini adalah hasil yang diharapkan, sebuah "salinan" dari pohon direktori di mana setiap file adalah hardlink ke file asli:
dirB/ # normal directory
dirB/file1 # hardlink to dirA/file1
dirB/x/ # normal directory
dirB/x/file2 # hardlink to dirA/x/file2
dirB/y/ # normal directory
dirB/y/file3 # hardlink to dirA/y/file3
pax
, pada FreeBSD,cp -a
tidak memiliki tautan tautan keras.POSIXly, Anda akan gunakan
pax
dalam mode baca + tulis dengan-l
opsi:(
-pe
Mempertahankan semua atribut kemungkinan file (dalam hal ini hanya direktori) yang disalin, seperti GNUcp
's-a
tidak).Sekarang, meskipun standar , perintah itu belum tentu sangat portabel .
Pertama, banyak sistem berbasis GNU / Linux tidak termasuk
pax
secara default (meskipun itu utilitas POSIX non-opsional).Kemudian, sejumlah bug dan ketidaksesuaian dengan beberapa implementasi menyebabkan sejumlah masalah dengan kode itu.
pax
(setidaknya) tidak berfungsi saat digunakan-rwl
bersama dengan-s
. Untuk beberapa alasan, tampaknya ini menerapkan substitusi ke path asli dan yang disalin. Jadi di atas, ia akan mencoba melakukan beberapalink("dirB/file", "dirB/file")
alih-alihlink("dirA/file", "dirB/file")
.pax
tidak membuat hardlink untuk file bertipe symlink (perilaku yang diizinkan oleh POSIX). Tidak hanya itu, tetapi juga menerapkan substitusi ke target symlinks (perilaku yang tidak diizinkan oleh POSIX). Jadi misalnya jika adafoo -> AA
symlink didirA
, itu akan menjadifoo -> BA
didirB
.Juga, jika Anda ingin melakukan hal yang sama tetapi dengan jalur file yang sewenang-wenang yang isinya disimpan dalam
$src
dan$dst
, penting untuk disadari bahwapax -rwl -- "$src" "$dst"
menciptakan struktur direktori penuh$src
di dalam$dst
(yang harus ada dan menjadi direktori). Misalnya, jika$src
inifoo/bar
, maka,$dst/foo/bar
dibuat.Jika sebaliknya, Anda ingin
$dst
menjadi salinannya$src
, yang termudah adalah melakukannya sebagai:(yang juga akan mengatasi sebagian besar masalah yang disebutkan di atas tetapi akan gagal jika jalur absolut
$dst
berakhir pada karakter baris baru).Sekarang itu tidak akan membantu pada sistem GNU / Linux di mana tidak ada
pax
.Sangat menarik untuk dicatat bahwa
pax
diciptakan oleh POSIX untuk menggabungkan fiturtar
dancpio
perintah.cpio
adalah perintah Unix historis (dari 1977) yang bertentangan dengan penemuan POSIX, dan ada implementasi GNU juga (bukanpax
satu). Jadi meskipun itu bukan lagi perintah standar (seperti pada SUSv2), itu masih sangat umum, dan ada serangkaian fitur yang biasanya dapat Anda andalkan.Setara dengan
pax -rwl
akancpio -pl
. Namun:cpio
mengambil daftar file input pada stdin sebagai lawan dari argumen (baris baru dibatasi yang berarti nama file dengan karakter baris baru tidak didukung)find
(find
dancpio
dikembangkan bersama oleh orang yang sama)).cpio
implementasi memiliki opsi untuk mempertahankan sebagian, tetapi tidak ada yang portabel).Jadi dengan
cpio
:sumber
-s /A/B
gantiA
denganB
yangdirA
jadidirB
. Jika nama direktori sumber Anda tidakA
, maka itu akan menyalin (tautan) itu sendiri. Lihat juga sisa jawaban untuk pendekatan yang mungkin lebih baik.Jawaban singkat:
sumber
Jika Anda mencari fitur copy-with-hardlinks untuk membuat snapshot atau cadangan (semua atau sebagian) file Anda lihat
rsnapshot
.sumber
Jawaban @ gudmundur-orn benar, tetapi jika Anda menggunakan BtrFS di Linux,
cp a --reflink=auto dirA dirB
lakukan triknya, dengan perbedaan file-file tersebut sebenarnya berbeda dan mengubah yang satu tidak mengubah yang lain. Anda dapat mencapai sebagian besar sama dengancp -c
di Mac dengan APFS (auto
akan melakukan salinan lengkap jika tidak memungkinkan,-c
akan gagal).Setiap sistem file SAP harus dapat melakukan itu, tetapi vendor belum menyetujui opsi baris perintah standar.
sumber