Yanıtlar:
GNU / Linux'ta chownve chmodbir --referenceseçenek var
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--referencebir parametre chmodve chown:) önce.
Böyle (-olmayan gömülü) Linux veya Cygwin gibi herhangi unix GNU kamu hizmetleri, üzerinde, kullanabilir chmod --referencevechown --reference .
Sisteminiz varsa ACL , ACL komutları denemek getfaclve setfacl. Bu komutlar sistemden sisteme biraz farklılık gösterir, ancak çoğunda getfacl other_file | setfacl -bnM - file_to_changeizinleri kopyalamak için kullanabilirsiniz . Bu mülkiyeti kopyalamaz; Bunu, ls -l other_fileboş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")" tofileGNU Coreutils'te, ancak CLI yardımcı programı POSIX olmadığından --referencebu 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 ( --referenceseç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.
statBurada * 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 statbulunamadı. Bu benim yapılandırmamla ilgili bir sorun olabilir.
Bu benim için çalışıyor:
cp -p --attributes-only <from> <to>