Come rimuovere in modo ricorsivo il bit eseguibile dai file (non dalle directory)


Risposte:


133

Con GNU chmod(su Ubuntu) variante a comando singolo (a partire dalla directory corrente):

chmod -R -x+X .

Spiegazione:

  • -R - operare in modo ricorsivo
  • -x - rimuovere i flag eseguibili per tutti gli utenti
  • +X - imposta flag eseguibili per tutti gli utenti se si tratta di una directory

In questo caso la capitale si Xapplica solo alle directory perché tutte le flag eseguibili sono state cancellate da -x. Altrimenti +Ximposta flag eseguibili anche se il flag è stato originariamente impostato per qualsiasi utente, gruppo o altro.

Con BSD chmod(che è presente su Mac OS X) devi farlo separatamente in due comandi:

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

(Se si desidera includere anche i file nascosti nella directory principale, probabilmente è necessario modificare * in. (Punto), ma non è stato testato.)


1
Su Ubuntu 13.04 è necessaria una piccola modifica:chmod -R a-x+X *
Eero Aaltonen il

@EeroAaltonen: grazie per la nota. Ciò potrebbe accadere se il tuo umasknon consente l' xautorizzazione per tutti. Usi il valore predefinito umasko l'hai modificato? Potresti inviare l'output del umaskcomando per favore? Oltre alla tua soluzione c'è anche questa possibilità: chmod -R a-x,+X *che imposterà l' xautorizzazione in base alla tua umask. Aggiornerò la risposta, ma vorrei prima verificare il comportamento in BSD / Mac OS X.
pabouk,

@pabouk oopsie! In realtà era la scatola CentOs in cui avevo impostato la mia umask su 0007.
Eero Aaltonen,

Questo è solo triste ... :( Mi piace la findvariante nella risposta qui sotto per il suo stile di combinazione di strumenti semplici che fanno bene una cosa.
mikezter

2
Usa .invece di *se vuoi che questo sia applicato a tutti i file
John Magnolia,

46

Se prima esegui il cd nel percorso corretto:

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

o

chmod -x $(find . -type f)

La ricerca trova tutti i file di tipo 'f' (che significa file normale) nel percorso. e quindi chiama chmod -x su ciascun file. Il {} viene sostituito con il nome del file e il \; termina il comando chmod.


6
Se findlo supporti, usa -exec ... \+invece di -exec ... \;- richiederà meno fork+ execs. In caso contrario, utilizzare find ... -print0 | xargs -0 ....
effimero

5
Ho usato questa tecnica, ma con "-perm +111" aggiunto alla ricerca, quindi solo quelli di chmod che hanno il set di x-bit:find . -type f -perm +111 -exec chmod -x {} \;
chrish,

4
+1 @Matthijs Il motivo per cui è meglio della soluzione di pabouk è che questo comando lascia da sole le directory, mentre pabouk reimposta il bit eseguibile in tutte le directory. Potrebbero esserci alcune directory in cui il bit eseguibile non è impostato e il comando di pabouk lo imposta, mentre si potrebbe desiderare di lasciarli così come sono.
MariusMatutiae,

il secondo approccio fallirà per i percorsi che contengono spazi.
MestreLion,

@ephemient: se i tuoi findsupporti -print0sono abbastanza sicuro che supporterà anche-exec
MestreLion

3

Sotto Linux e Unix in una finestra terminale o Su Mac OS X, usa questo in Terminal.app:

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

1
Questo, in sostanza, non è diverso dalla risposta di Matthijs P del 2011.
slhck,

Riesci a ricordare questa riga di comando? Non posso.
Mike L.,

Vedi il commento di effimero sotto la risposta di Matthijs per vedere perché questa risposta è utile.
PatrickT,

2

Il chmod -x+Xmodo in cui non ha funzionato per me su Ubuntu, quindi ho scritto questo script Python minimo:

#!/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)

Se nel tuo filesystem potrebbero esserci elementi extra fantasiosi come socket, potresti voler circondare l'ultimo chmod con un try / catch.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.