dosya iznini özyinelemeli olarak değiştirebilir, dizinleri değiştiremez misiniz?


13

Bir unix sistemine geçirdiğim bazı dosyaların izinlerinde toplu olarak yinelenen bir değişiklik yapıyordum. Onları ug + rw olarak değiştirdim, ama sonra alt dizinleri geçemediğimi fark ettim. Man sayfasına baktım ve chmoddizinleri hariç tutmak için herhangi bir açıklama görmedim, bu yüzden biraz googledim ve insanların finddizinlerde kullanıcı ve grup için 'yürütme' izinlerini tekrar tekrar değiştirdiklerini buldum . Bunu yaptım ve sonra onlara bakabilirdim.

Ama bana öyle geliyor ki bu chmodbulguyu yapabilmeliydim - dosyaları tekrar tekrar okumak / yazmak için değiştirmek, ancak dizinleri kurtarılamaz hale getirmek için değil. Bunu 'doğru' şekilde mi yaptım yoksa bunu yapmanın daha basit bir yolu var mı?

Yanıtlar:


12

Daha iyi çözüm

chmod -R ug=rwX,o=rX /path

burada büyük harf şu Xanlama gelir:

dosya bir dizin veya zaten bazı kullanıcılar için yürütme iznine sahip

( chmodman sayfasından alıntılanmıştır ).

Veya kullanmak isterseniz find

find /path \( -type f -exec chmod ug=rw,o=r   {} + \) -o \
           \( -type d -exec chmod ug=rwx,o=rx {} + \)

USB sabit sürücüm için bu komutun herkes sürümü için geniş açık kullandım: chmod -v -R ugo = rwX / path Teşekkürler!
Dostum

Anlaşılan kullanmadan hiçbir şekilde findbu ise (ben konuda benim googlings yoluyla buraya geldi.) 700'e kadar 600'e tüm dosya izinlerini ve tüm dizin izinlerini ayarlamak için olabilir tek ile yapılabilir chmod -Rkomutu, beni düzelt çekinmeyin.
Joker

@Wildcard: tam olarak değil, komut chmod -R u=rwX,go= /pathneredeyse istediğinizi yapar: yürütme bitinin önceden ayarlanmış olup olmadığına bağlı olarak tüm dirsleri 700'e ve tüm dosyaları 600 veya 700'e ayarlar ve bence bu yapılacak doğru şey .
enzotib

1
@enzotib, evet — neredeyse ama tam olarak değil. Benim durumumda , komut dosyaları veya ikili dosyalar olsun veya olmasın , tüm dosyalar için yürütme bitini (ancak elbette dizinler değil) devre dışı bırakmak istiyorum . Yani findyazdığın komutu bir şablon olarak çok yararlı oldu. :)
Joker

@Wildcard, önce yürütme bitini özyinelemeli olarak kaldırmaya, sonra yukarıdaki komutu kullanarak yalnızca dizinlere geri eklemeye ne dersiniz?
Michael

3

Bulmayı kullanmak, 'doğru' yol ve tek programlı yol olsa da, varyasyonlar olsa da:

find . -type f -exec chmod ug+rw {} +  # "+" may not be on all systems

veya

find . -type f -print0 | xargs -r0 chmod ug+rw  # similar to the -exec + functionality

veya en yavaş:

find . -type f -exec chmod ug+rw {} \;  # in case xargs is not installed

Bunların her biri bir dosya seçer (dizin değil, sembolik bağlantı) ve chmodkomutu ona uygular . İlk ikisi, chmodher seferinde bir maksimuma ulaşılana kadar (genellikle 10) dosyayı dahili komut satırının sonuna ekleyerek çağrı sayısını azaltır , daha sonra komutu çağırır ve yeni bir komut oluşturmaya başlar. Son ifade her dosya için yeni bir süreç oluşturur, bu yüzden daha az verimlidir.

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.