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ı) chgrp
bir üzerinde dizine . Benim adlandırma kuralı harfler eklemek için basitçe unutmayın ld
temsil 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ı . senaryofoo
chgrpld -R staff foo
Ayrı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 .chgrpld
chgrp
chgrp
chgrpld
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.
chgrp
Hata çı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 chgrpld
tuşuna basın enter.
- Yazıp
open chgrpld
tuşuna basın enter.
Tarayıcıdan:
- Aşağıdaki kodu kopyalayıp yapıştırın, açılan
chgrpld
dosyaya kaydedin ve kaydedin, ardından dosyayı kapatın.
Geri Terminalde:
- Yazıp
chmod +x chgrpld
tuşuna basın enter.
- Yazıp
sudo mkdir -p /usr/local/bin
tuşuna basın enter. Temiz bir OS X 10.11.5 kurulumunda, bin
dizinin içinde /usr/local
olmasına rağmen bulunmadığını unutmayın PATH
.
- Yazın şifreyi basın enter.
- Yazıp
sudo cp chgrpld /usr/local/bin
tuş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
directory
olan ad / yol adı hedef ait dizinde olduğu kilitli , ya da değil, ve ya içeren dosyalar / dizinleri vardır kilitli de. chgrp
Hangi nesnenin , örneğin group file ...
üzerinde hareket etmesine izin verdiğinin aksine , bir seferde chgrpld
bir 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ış! ".