Özyinelemeli chmod: dosyalar için rw, dizinler için rwx


28

Çok chmodfazla dosya ve dizin istiyorum. As xdizinlerinin listesini gösterir ve ben başvurmak istiyorum düzenli dosyalar için yürütmek rwdosyalar için ve rwxdizinleri için. Sadece chmodkomutu kullanarak mümkün mü ?

Değilse, en uygun yol nedir?

Bir yaparak chmod -R 770Normal dosyalar çalıştırılabilir olmak istemiyorum gibi bir ihtimal değildir.


1
Gerçekten halka açık dosya ve dizinlere yazma izni istiyor musunuz? Bu, herhangi bir dosyayı kimin sileceği umrunda değil mi?
Jonathan Leffler

Doğru. Yukarıda değiştirdim.
Silinmiş

Yanıtlar:


19

Bunu bazen tek bir findkomut kullanarak yapıyorum . Çirkin ama etkili.

find /p/a/t/h \( -type d -exec chmod 755 {} \; \) -o \( -type f -exec chmod 644 {} \; \)

Yolların boşluk bırakması durumunda "{}" alıntılanması gerekmez mi? Beğen find . -type d -exec chmod -vc 755 "{}" \;( -vcbazı geri bildirimler dahil ). (Ve belki de açıklığa kavuşturmak için, iki bağımsız komutu da cevaba ekler misiniz?)
Arjan

Hayır, {} alıntı yapılmasına gerek yok (sadece kesin olarak emin olmak için test ettim). Komuta {} ekler bulduğunuzda, düzgün bir şekilde kaçar. Bulguların iç çalışmalarına bakmadım, ancak exec () 'e iletmek için bir argüman dizisi oluşturduğunu ve dosya ismini diziye strcpy () getireceğini varsayardım. Chmod kendi argümanlarına baktığında düzgün bir şekilde ortaya çıkar.
baumgart

37

Man sayfasından X iznini kullanın:

Dosya bir dizinse veya çalıştırma / arama bitlerinden herhangi biri orijinal (değiştirilmemiş) modda ayarlanmışsa, execute / search bit. "X" perm sembolüyle yapılan işlemler sadece "+" op sembolüyle bağlantılı olarak anlamlıdır ve diğer tüm durumlarda göz ardı edilir.

Yani aşağıdakileri yapın:

chmod -R a-x [directory]
chmod -R a+rwX [directory]

Bu, execute bitini tüm dosya ve dizinlerden kaldırır, ardından her şeye okuma ve yazma ayrıcalıkları ekler ve yalnızca dizinlere ayrıcalıkları yürütür. (Hiçbir düzenli dosya, ilk adımdan itibaren çalıştırma bitini artık çalıştırmaz.)


1
bu, 666 kipini normal dosyalara zorlamaz. Zaten ayarlanmışsa, normal dosyalar için çalıştırılabilir biti temizlemez.
quack quixote

Yani bu durumda chmod -R a-x [directory]takip edebilir miydiniz chmod -R a+rwX [directory]?
jwaddell

@jwaddel: Bu çalışması gerekir. Daha sonra zaten yürütmek biraz var sadece dizinleri ve düzenli dosyalara yürütmek ekleyerek bakılmaksızın dosyanın / dizin türünden bağımsız olarak, tüm bitlerini yürütmek kaldırıyoruz (şimdi hiçbiri değildir.)
Ben S

Ben bir kez a-x, dizin erişilebilir değil. Aslında, chmod izin verilmezse başarısız olur ve dizin içindeki dosyalardan çalıştırılabilir biti kaldırmaz. Bunu kök olmadan yapmanın bir yolu var mı?
avakar

14

findBununla birlikte de kullanabilirsiniz xargs:

find . -type f -print0 | xargs -0 chmod 666
find . -type d -print0 | xargs -0 chmod 777

burada -typebelirtir d irectory veya f Ile.


1
Xargs'ın uzunluk sınırlaması yok mu? Bir sürü dosya ve dizin var.
Silindi

2
Önce dizinleri, sonra dosyaları yapardım. Aksi takdirde, izinsiz olma nedeniyle bazı alt ağaçları kaçırmanız riskini alır. Ayrıca, listenin chmod'dan önce veya sonra keşfedildiğini, aksi takdirde yukarıdakiyle aynı olup olmadığını kontrol etmelisiniz. Ve evet, xargs kullanmaktan kaçınırdım.
Stefano Borini

1
xargsuzun komut satırlarını birden fazla yürütmeye ayıracak kadar akıllıdır. Xargs man sayfanıza bakın ve kontrol ettiğinizden emin olun xargs --show-limits.
Mike,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.