Yanıtlar:
GNU / Linux'ta chown
ve chmod
bir --reference
seçenek var
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--reference
bir parametre chmod
ve chown
:) önce.
Böyle (-olmayan gömülü) Linux veya Cygwin gibi herhangi unix GNU kamu hizmetleri, üzerinde, kullanabilir chmod --reference
vechown --reference
.
Sisteminiz varsa ACL , ACL komutları denemek getfacl
ve setfacl
. Bu komutlar sistemden sisteme biraz farklılık gösterir, ancak çoğunda getfacl other_file | setfacl -bnM - file_to_change
izinleri kopyalamak için kullanabilirsiniz . Bu mülkiyeti kopyalamaz; Bunu, ls -l other_file
boşluk içeren kullanıcı veya grup adlarınızın olmadığını varsayarak, dikkatli bir şekilde ayrıştırma ile yapabilirsiniz.
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
Matteo cevabına göre bir bash komutu yaptı :)
Kod:
chmod $( stat -f '%p' "$1" ) "${@:2}"
Kullanımı:
cp-permissions <from> <to>...
${*:2}
? Bunu bir daha yapma! Dosya adlarından herhangi biri boşluk (veya sekmeler) içeriyorsa, bu başarısız olur. Kullanın "${@:2}"
. Ayrıca, "$1"
sadece yerine kullanın $1
.
chmod "$(stat -c '%a' "$fromfile")" tofile
GNU Coreutils'te, ancak CLI yardımcı programı POSIX olmadığından --reference
bu durumda da kullanabilirsiniz stat
, hatta pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html ls -l
bunu kesmeyecek diyor : "ls çıktısı (-l ve ilgili seçeneklerle), dosyaları bilinen bir duruma geri yüklemek için chmod ve dokunma gibi yardımcı programlar tarafından mantıksal olarak kullanılabilecek bilgiler içerir, ancak bu bilgiler doğrudan bu yardımcı programlar tarafından kullanılamayan bir biçimde sunulur veya kolayca kullanılabilecek bir formata çevrilebilir. "
GNU's chmod / chown ( --reference
seçeneği destekleyen ) ile bir sistem kullanmıyorsanız , çıktısını ayrıştırmayı deneyebilirsiniz.ls -l
Burada küçük bir betik chmod
(eğer genişletilmiş regex'leri destekleyen bir görüntünüz varsa, daha okunaklı bir şekilde yazılabilirler…)
#!/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}
GÜNCELLEME :
Bu kullanarak daha da kolay stat
:
chmod $( stat -f '%p' ${reference} ) ${files}
ls -l
Çıktıyı çözümlemek yerine çıktıyı çözümleyebilirsiniz stat
.
stat
Burada * BSD sözdizimini kullanıyorsunuz . Sizin chmod $(stat ...)
komut çünkü çalışmayacak %p
* BSD yıllardan yalnız çıkışlar çok fazla bilgi chmod
, kullanmak %Lp
çıkışına sadece u / g / o bitleri. Yapışkan / setuid / setgid bitleri için biraz daha ayrıntılı bir şey gerekir.
Matteo'nun senaryosuna bir düzenleme eklemek istedim . Bir for döngüsü, dosyalar üzerinde chmod komutunu çalıştırmadan önce var olduklarını doğrulamak için kullanılmalıdır. Bu, komut dosyasının daha incelikli bir şekilde bozulmasına izin verecektir.
Bunun en iyi seçenek olduğunu düşünüyorum çünkü Solaris, Linux gibi tüm * nix işletim sistemlerinde kullanılabiliyor.
#!/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}
Solaris 10 makinelerimden birinde stat
bulunamadı. Bu benim yapılandırmamla ilgili bir sorun olabilir.
Bu benim için çalışıyor:
cp -p --attributes-only <from> <to>