Çalıştırılabilir bit dosyalardan yinelemeli olarak nasıl kaldırılır (dizinlerden değil)


Yanıtlar:


132

GNU ile chmod(Ubuntu'da) tek komut varyantı (geçerli dizinden başlayarak):

chmod -R -x+X .

Açıklama:

  • -R - özyinelemeli çalış
  • -x - tüm kullanıcılar için çalıştırılabilir bayrakları kaldır
  • +X - Bir dizin ise tüm kullanıcılar için çalıştırılabilir bayrakları ayarla

Bu durumda, sermaye Xyalnızca dizinlere uygulanır, çünkü tüm çalıştırılabilir bayraklar tarafından temizlenir -x. Aksi halde +X, bayrak başlangıçta herhangi bir kullanıcı, grup veya başkaları için ayarlanmışsa, çalıştırılabilir bayrak (lar) da ayarlar.

BSD ile chmod(Mac OS X'te bulunur), iki komutla ayrı olarak yapmanız gerekir:

sudo chmod -R -x * && sudo chmod -R +X *

(Gizli dosyaları ana dizine de dahil etmek istiyorsanız, muhtemelen * ile. (Nokta) değiştirmeniz gerekir, ancak denenmez.)


13.04 Ubuntu'da küçük bir tweak gereklidir:chmod -R a-x+X *
Eero Aaltonen

@EeroAaltonen: Notunuz için teşekkürler. Senin bu durum ortaya çıkabilir umaskizin vermez xhepsi için izin. Varsayılan kullanıyor musunuz umaskveya değiştirdiniz mi? Lütfen umaskkomutun çıktısını gönderebilir misiniz ? Çözümünüzün yanı sıra şu olasılık da var: chmod -R a-x,+X *bu xsizin izninizi kendinize göre ayarlayacaktır umask. Cevabı güncelleyeceğim ancak ilk önce BSD / Mac OS X'deki davranışı kontrol etmek istiyorum.
pabouk

@pabouk oopsie! Aslında, umask'ımı 0007 olarak ayarlamamı sağlayan CentOs kutusuydu.
Eero Aaltonen

Bu ... :( Ben sadece üzgün nasıldır findBir Şey Kuyusu do basit araçlara birleştirerek bu tarzı için aşağıdaki yanıtında varyantı.
mikezter

2
.Bunun *tüm dosyalara uygulanmasını istiyorsanız yerine kullanın
John Magnolia

46

Önce doğru yola cd girerseniz:

find . -type f -exec chmod -x {} \;

veya

chmod -x $(find . -type f)

Bulma, yoldaki 'f' türündeki (normal dosya anlamına gelen) tüm dosyaları bulur. ve sonra her dosyaya chmod -x'i çağırır. {}, Dosya adı ve \; chmod komutunu sonlandırır.


6
Desteğiniz finddestekliyorsa, -exec ... \+yerine kullanın -exec ... \;- daha az fork+ execs gerektirir . Olmazsa kullanın find ... -print0 | xargs -0 ....
ephemient

5
Bu tekniği kullandım, ancak "-perm +111" ile bulguyu ekledim, bu yüzden yalnızca x-bit dizisine sahip olan find . -type f -perm +111 -exec chmod -x {} \;
chmod'lar

4
+1 @Matthijs Bunun pabouk'un çözümünden daha iyi olmasının nedeni, bu komutun yalnızca dizinleri bırakmasıdır, pabouk ise yürütülebilir dizini tüm dizinlerde yeniden ayarlar. Çalıştırılabilir bit'in ayarlanmadığı bazı dizinler olabilir ve pabouk'un komutu onu olduğu gibi bırakmak isteyebilir.
MariusMatutiae

2. yaklaşım boşluk içeren yollar için başarısız olur.
MestreLion 16:15

@ephemient: findDestekleriniz varsa -print0da destekleyeceğinden eminim-exec
MestreLion 16:15 '

3

Terminal penceresinde Linux ve Unix altında veya Mac OS X'te, Terminal.app'da bunu kullanın:

find . -type f -print0 | xargs -0 chmod -x

1
Bu, özünde, Matthijs P'nin 2011'deki cevabından farklı değil.
slhck

Bu komut satırını hatırlıyor musun? Yapamam
Mike L.

Bu cevabın neden yararlı olduğunu görmek için ephemient'in Matthijs’in cevabını yorumuna bakınız.
PatrickT

2

Yol chmod -x+Xbenim için de ubuntu'da işe yaramadı, bu yüzden bu minimal piton senaryosunu yazdım:

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

Dosya sisteminizdeki soketler gibi herhangi bir fantezi ekstra malzeme varsa, son chmod'u bir dene / yakala ile çevrelemek isteyebilirsiniz.

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.