Bagaimana cara mengkloning / menyalin semua atribut file / direktori ke file / direktori yang berbeda?

14

Saya ingin menyalin atribut (kepemilikan, grup, ACL, atribut diperluas, dll.) Dari satu direktori ke yang lain tetapi bukan isi direktori itu sendiri.

Ini tidak bekerja:

cp -v --attributes-only A B
cp: omitting directory `A'           

Catatan: Tidak harus begitu cp.

Grzegorz Wierzowiecki
sumber
1
Anda tidak lulus -r, sehingga mengabaikan direktori. Tapi saya kira Anda hanya ingin menyalin atribut, bukan isinya? Saya hanya bisa memikirkan hacks jelek. Perhatikan juga bahwa installdapat mempertahankan konteks SELinux.
lynxlynxlynx
3
kemungkinan duplikat kepemilikan dan izin Clone dari file lain?
Gilles 'SO- stop being evil'
1
@Gilles, terima kasih telah menunjuk ke topik lain. Ini memecahkan bagian dari masalah: kepemilikan dan mode. Bagaimana dengan atribut yang diperluas?
Grzegorz Wierzowiecki
1
@ GrzegorzWierzowiecki Saya khawatir sangat sedikit alat yang mendukung atribut yang diperluas. Jika itu penting, gunakan saran rsync killermist.
Gilles 'SO- berhenti bersikap jahat'
Btw. Berikut adalah contoh yang bagus di mana orang dapat melihat xattrs sedang beraksi: GUI Dolphin di KDE: imgur.com/oguuJNm atau URL dari mana file diunduh ditetapkan oleh browser: referensi: gist.github.com/gwpl/a00e18bc150f1e3518335d13c5e46ad7 + freedesktop.org/ wiki / CommonExtendedAttributes + vhanda.in/blog/2014/07/tagging-your-files
Grzegorz Wierzowiecki

Jawaban:

13

Setelah sedikit trial and error pada commandline, saya pikir saya sudah menemukan jawabannya. Tapi itu bukan cpjawaban yang terkait.

rsync -ptgo -A -X -d --no-recursive --exclude=* first-dir/ second-dir

Ini tidak:

-p, --perms                 preserve permissions
-t, --times                 preserve modification times
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
-d, --dirs                  transfer directories without recursing
-A, --acls                  preserve ACLs (implies --perms)
-X, --xattrs                preserve extended attributes
    --no-recursive          disables recursion

Sebagai referensi

    --no-OPTION             turn off an implied OPTION (e.g. --no-D)
-r, --recursive             recurse into directories
pembunuh kulit
sumber
Hasil edit terakhir itu pasti menjadi hit di sana. Dengan atau tanpa / pada dir kedua, yang akhirnya melakukan apa yang diminta, sepertinya.
killermist
Slash tambahan hanya membuat perbedaan pada argumen pertama, bukan yang kedua. Itu dijelaskan dalam paragraf ke-3 atau ke-4 dari USAGEbagian rsync(1)halaman manual.
jw013
@ jw013 Setelah membaca dokumentasi rsync berulang kali, berbulan-bulan yang lalu, kesimpulan saya adalah bahwa garis miring adalah tersirat "ke", apakah dalam argumen pertama (kedua, ketiga, dll) atau terakhir. Tapi sekali lagi, saya sering mengakhiri perintah saya dengan / pada argumen terakhir untuk menyiratkan / menuntut pengaruh "ke".
killermist
Perasaan saya untuk menyalin semua atribut direktori dan tidak ada file biasa rsync -a -AX --include='*/' --exclude='*'. Saya belum diuji.
Gilles 'SANGAT berhenti menjadi jahat'
@ jw013 Terima kasih telah membantu menjawab pertanyaan ini. Saya mencoba banyak opsi pada lingkungan pengujian kotak pasir kecil saya, dan terus mendekat, tetapi memiliki beberapa bagian yang tidak berfungsi dengan benar.
killermist
0
chmod --reference=first-dir second-dir
Etienne Dublé
sumber
2
Ini tidak akan bekerja secara rekursif, dan saya percaya itu tidak akan menyalin ACL atau atribut yang diperluas.
Mat
1
Seharusnya tidak bersifat rekursif: OP meminta "bukan isi direktori itu sendiri", dan jawaban yang diterima memberitahu rsync --no-recursive. Masalah dengan jawaban ini adalah bahwa ia tidak melakukan ACL atau XATTR.
ShadSterling
0
cp -rfp from_dir to_dir
  • -r - rekursif
  • -f - kekuatan
  • -p - melestarikan atribut: mode, kepemilikan, cap waktu
burtsevyg
sumber
Juga perlu - hanya
atribut
0

Saya tidak mengerti karena tampaknya bekerja untuk orang lain, tetapi metode rsync gagal untuk saya di FreeBSD dengan ZFS. Tidak ada yang terjadi. Namun metode Jean-François Dockes berhasil. (lihat: https://www.lesbonscomptes.com/pxattr/ ) Direktori sumber = A & direktori tujuan = B, dari pertanyaan awal.

pxattr -lR A > tmp.EAs

(edit baris pertama tmp.EAs untuk mengubah direktori A ke B, s / A / B /)

pxattr -S tmp.EAs
cira
sumber
Jadi, Anda tidak hanya merekomendasikan metode orang lain ; Anda merekomendasikan program orang lain , bukan? Tidak apa-apa, tapi saya hanya membuang waktu lima menit untuk mencari dokumentasi pada program non-standar yang kurang dikenal. Alangkah baiknya jika Anda menyatakan lebih jelas bahwa Anda merekomendasikan agar orang mengunduh program non-standar yang kurang dikenal.
G-Man Mengatakan 'Reinstate Monica'
mengangkat bahu Ada di pohon port. Itu tidak persis membuatnya non-standar. Ini tidak sejelas pyxattrdan saya mencobanya juga. Ini semacam kacang yang sulit retak. Seharusnya gnu cp bekerja untuk ini, tapi aku tidak bisa melakukannya. Atribut yang Diperpanjang pantas lebih baik dari ini. Juga, pxattr berfungsi setidaknya di linux, osx, & bsd.
cira
0
rsync -aAX --exclude='*' src_dir/ dst_dir

di mana dst_dir - adalah direktori target. Atau:

rsync -dADXgot src_dir dst_dir

di mana dst_dir - adalah direktori yang berisi direktori target, atau direktori target yang tidak ada.

Dari halaman manual rsync:

    -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
        --exclude=PATTERN       exclude files matching PATTERN

    -d, --dirs                  transfer directories without recursing
    -p, --perms                 preserve permissions
    -A, --acls                  preserve ACLs (implies -p)
    -X, --xattrs                preserve extended attributes
    -o, --owner                 preserve owner (super-user only)
    -g, --group                 preserve group
        --devices               preserve device files (super-user only)
        --specials              preserve special files
    -D                          same as --devices --specials
    -t, --times                 preserve modification times
Alek
sumber
-3

Anda memerlukan "-r" untuk menyalin direktori.

tiga kali lipat
sumber
2
Saya pikir saya salah paham dengan Anda, Anda tidak perlu isinya, hanya xattr. Jika itu untuk SELinux, Anda bisa menggunakan chcon referensi direktori asli (A).
lipat
-rmenyiratkan salinan semua subdirektori dan file di dalamnya ... Saya tidak ingin menyalin seluruh hierarki ... Saya ingin menyalin atribut hanya untuk satu dan hanya satu direktori - tanpa mempengaruhi isinya.
Grzegorz Wierzowiecki