Apakah ada perintah atau panji untuk mengkloning kepemilikan dan izin pengguna / grup pada file dari file lain? Untuk membuat perms dan kepemilikan persis dengan file lain?
Apakah ada perintah atau panji untuk mengkloning kepemilikan dan izin pengguna / grup pada file dari file lain? Untuk membuat perms dan kepemilikan persis dengan file lain?
Jawaban:
Di GNU / Linux chown
dan chmod
punya --reference
opsi
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--reference
parameter chmod
dan chown
sebelumnya :).
Pada setiap unix dengan utilitas GNU, seperti Linux (tidak tertanam) atau Cygwin, Anda dapat menggunakan chmod --reference
danchown --reference
.
Jika sistem Anda memiliki ACL , coba perintah ACL getfacl
dan setfacl
. Perintah-perintah ini sedikit berbeda dari sistem ke sistem, tetapi pada banyak Anda dapat menggunakan getfacl other_file | setfacl -bnM - file_to_change
untuk menyalin izin. Ini tidak menyalin kepemilikan; Anda dapat melakukannya dengan penguraian yang hati-hati ls -l other_file
, dengan asumsi bahwa Anda tidak memiliki nama pengguna atau grup yang berisi spasi putih.
LC_ALL=C ls -l other_file | {
read -r permissions links user group stuff;
chown -- "$user:$group" file_to_change
}
getfacl other_file | setfacl -bnM - file_to_change
Melakukan perintah bash berdasarkan respons Matteo :)
Kode:
chmod $( stat -f '%p' "$1" ) "${@:2}"
Pemakaian:
cp-permissions <from> <to>...
${*:2}
? Jangan pernah melakukan itu lagi! Itu akan gagal jika salah satu nama file mengandung spasi (atau tab). Gunakan "${@:2}"
. Juga, gunakan "$1"
bukan hanya $1
.
chmod "$(stat -c '%a' "$fromfile")" tofile
dalam GNU Coreutils, tetapi Anda mungkin juga menggunakan --reference
dalam kasus itu karena stat
utilitas CLI bukan POSIX, bahkan mengatakan pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.htmlyang ls -l
tidak akan memotongnya: "Output dari ls (dengan -l dan opsi terkait) berisi informasi yang secara logis dapat digunakan oleh utilitas seperti chmod dan sentuh untuk mengembalikan file ke kondisi yang diketahui. Namun, informasi ini disajikan dalam format yang tidak dapat digunakan langsung oleh utilitas tersebut atau menjadi mudah diterjemahkan ke dalam format yang bisa digunakan. "
Jika Anda tidak menggunakan sistem dengan chmod / chown GNU (yang mendukung --reference
opsi), Anda dapat mencoba mengurai output darils -l
Berikut skrip kecil untuk chmod
(jika Anda memiliki tampilan yang mendukung regex yang diperluas, skrip tersebut dapat ditulis dengan cara yang lebih mudah dibaca ...)
#!/bin/sh
reference=$1
shift
files=$*
# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )
chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}
PEMBARUAN :
Ini bahkan lebih mudah menggunakan stat
:
chmod $( stat -f '%p' ${reference} ) ${files}
ls -l
mem -parsing output, Anda bisa mem-parsing stat
output.
stat
sintaks * BSD di sini. chmod $(stat ...)
Perintah Anda tidak akan berfungsi karena %p
sendirian menghasilkan terlalu banyak informasi untuk * BSD chmod
, gunakan %Lp
hanya untuk output bit u / g / o. Sesuatu yang sedikit lebih rumit akan diperlukan untuk bit sticky / setuid / setgid.
Saya ingin menambahkan penyesuaian pada skrip Matteo . A for loop harus digunakan untuk memvalidasi bahwa file ada sebelum benar-benar menjalankan perintah chmod pada mereka. Ini akan membuat kesalahan skrip lebih anggun.
Saya pikir ini adalah pilihan terbaik karena dapat digunakan untuk semua * nix OS, seperti Solaris, Linux, dll.
#!/bin/sh
reference=$1
shift
files=$*
for file in $reference $files; do
[ -f $file ] || { echo "$file does not exist"; exit 1; }
done
# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )
chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}
Saya menemukan bahwa di salah satu mesin Solaris 10 saya, stat
tidak ditemukan. Itu mungkin masalah dengan konfigurasi saya.
Ini bekerja untuk saya:
cp -p --attributes-only <from> <to>