Aşağıdaki Ben oluşturarak sorunu gidermek için nasıl kullanıldığını açıklayan bir örnek sarıcı komut dosyası için chgrp komut bir üzerine hareket etmek , hedef dizinde bir sorunla karşılaştığınız kilitli dosyaları .
Bir kullanarak bash komut dosyası adını chgrpld, bunu aynı komut satırı argümanları (geçerdi seçenekleri , işlenen ve dizin ı yürütme olsaydı) chgrpbir üzerinde dizine . Benim adlandırma kuralı harfler eklemek için basitçe unutmayın ldtemsil kendisine kilitli dizini bunun üzerinde çalışır o, dizinleri vardır kilitli ve ya içeren, ya da değil dosya / dizinleri vardır kilitli de. Normalde nerede kullanacağımı, örneğin bir dizinichgrp -R staff foo nerede kullanacağımı . senaryofoochgrpld -R staff fooAyrıca , kilitli olmayan ve kilitli bir dosya sistemi nesnesi içermeyen bir dizinde çalışmak üzere kodlanmıştır ; bu nedenle , kilitli bir dosya sistemi nesnelerini kontrol etmek istemiyorsam, bir dizini hedeflerken düzenli bir yedek olarak kullanılmasına izin verir. önce ya da önce başarısız olsaydın, yine de kullanmak zorundasın .chgrpldchgrpchgrpchgrpld
Not: Bu komut dosyası , sınırlı test koşullarında çalışmak için yeterli miktarda sınırlı hata denetimi kullanır. O değil IMO ilk etapta oraya ait olmayan bir dosya sistemi nesne adına gömülü yeni satır işlemek için kodlanmış! İhtiyaç duyduğunuzda / ihtiyaçlarınızı karşılamak istediğinizde, istediğiniz zaman / istendiğinde ilave hata kontrolü ekleyerek değişiklik yapmaktan çekinmeyin.
Test ortamı, aşağıdaki listede gösterildiği gibi geçici bir dizinde OS X 10.11.5 idi , her biri bir dosyada ve kilitli dosyalardan birinde iki dizin var . Bir dizin / dosya kümesi içindedir grubun diğer grubu ise gruptaki ve ben olmak için her şeyi isteyen kulüpler grubunda . (Ek test bilgileri için bkz. Cevap sonunda Test Notu.)admin staff staff
Terminal çıkışı şunları gösterir:
- Bir özyinelemeli dizin listesi.
chgrpHata çıktısını gösteren bir deneme girişimi .
- Kullanımı
chgrpld, hatasız çalıştırılması.
- Başka bir özyinelemeli dizin listesi, grubun değiştiğini göstermek için .
$ ls -lRO
total 0
drwxr-xr-x 3 user staff - 102 Aug 9 2:00 bar
drwxr-xr-x 3 user admin - 102 Aug 9 2:00 foo
./bar:
total 0
-rw-r--r-- 1 user staff - 0 Aug 9 2:00 foo
./foo:
total 0
-rw-r--r-- 1 user admin uchg 0 Aug 9 2:00 bar
$ chgrp -R staff foo
chgrp: foo/bar: Operation not permitted
$ chgrpld -R staff foo
$ ls -lRO
total 0
drwxr-xr-x 3 user staff - 102 Aug 9 2:00 bar
drwxr-xr-x 3 user staff - 102 Aug 9 2:00 foo
./bar:
total 0
-rw-r--r-- 1 user staff - 0 Aug 9 2:00 foo
./foo:
total 0
-rw-r--r-- 1 user staff uchg 0 Aug 9 2:00 bar
$
chgrpld Bash betiğini oluşturmak ve komut isteminde hazır bulundurmak için :
Terminalde:
- Yazıp
touch chgrpldtuşuna basın enter.
- Yazıp
open chgrpldtuşuna basın enter.
Tarayıcıdan:
- Aşağıdaki kodu kopyalayıp yapıştırın, açılan
chgrplddosyaya kaydedin ve kaydedin, ardından dosyayı kapatın.
Geri Terminalde:
- Yazıp
chmod +x chgrpldtuşuna basın enter.
- Yazıp
sudo mkdir -p /usr/local/bintuşuna basın enter. Temiz bir OS X 10.11.5 kurulumunda, bindizinin içinde /usr/localolmasına rağmen bulunmadığını unutmayın PATH.
- Yazın şifreyi basın enter.
- Yazıp
sudo cp chgrpld /usr/local/bintuşuna basın enter.
- Yazın şifreyi basın enter. (Eğer gerekliyse.)
chgrpldŞimdi sadece chgrp komut gibi, kullanılabilir olması gerekir .
Kaynak kodu için chgrpld:
#!/bin/bash
o="${@:1:$(($#-1))}"
d="${@: -1}"
if [ -d "$d" ]; then
f=".locked_files_list_$(date "+%s")"
find "$d" -flags uchg > "$f" 2>/dev/null
if [ -s "$f" ]; then
while read -r l; do
chflags nouchg "$l"
done<"$f"
$(chgrp $o "$d")
while read -r l; do
chflags uchg "$l"
done<"$f"
rm "$f"
else
rm "$f"
$(chgrp $o "$d")
fi
else
echo " \"$d\" is not a directory!..."
exit 1
fi
exit 0
Özet: chgrpld [−fhv][−R[−H | −L | −P]] group directory
Seçeneklerin ve işleneninman chgrp açıklaması için Terminal'e bakınız .group
directoryolan ad / yol adı hedef ait dizinde olduğu kilitli , ya da değil, ve ya içeren dosyalar / dizinleri vardır kilitli de. chgrpHangi nesnenin , örneğin group file ...üzerinde hareket etmesine izin verdiğinin aksine , bir seferde chgrpldbir hedef dizinde ve tekrarlı olarak -R seçenekle hareket etmek üzere kodlandığına dikkat edin .
Not: Kullanıcı yürütmesini chgrpld belirtilen ait olmalıdır grubun ve olmayacak sahibi bir dizinde ve kilitli dosya sistemi nesneleri veya olmak süper kullanıcı .
İşletim sisteminin SIP sürümlerinde beklendiği gibi, SIP etkinse , SIP korumalı dosya sistemi nesneleri üzerinde çalışmaz .
Aşağıdaki resimde bir sözdizimsel vurgulama gösterir kod hakkında biraz açıklamak için daha kolay okuma için aralıklı ve girintili yorumlarla kod yapıyor.

Sınama Notu: Yukarıda gösterilen sınama ortamı yine de sınırlı olmasına rağmen, daha çok kilitli yuvalanmış dizin ve dosyalarla, boşluk içeren adlarla ve dosya adı içinde ters eğik çizgiler olmadan, daha karmaşık bir hiyerarşik dizin yapısı altında test ettim. Açıkçası gösteri amaçlı olarak, sadece konsept kanıtı için çıplak bir minimum yapı gösteriyorum. Yukarıda belirtildiği gibi, yine " O değil IMO ilk etapta oraya ait olmayan bir dosya sistemi nesne, adına gömülü bir yeni satır işlemek için kodlanmış! ".