modificare in modo ricorsivo l'autorizzazione al file ma non le directory?


13

Stavo facendo un cambiamento ricorsivo di massa delle autorizzazioni di alcuni file che avevo migrato su un sistema unix. Li ho cambiati in ug + rw, ma poi ho scoperto che non potevo attraversare le sottodirectory. Ho cercato la pagina man per chmode non ho visto alcuna spiegazione per escludere le directory, quindi ho cercato su Google un po 'e ho scoperto che le persone erano solite findmodificare in modo ricorsivo i permessi sulle directory per "eseguire" per utenti e gruppi. L'ho fatto e poi ho potuto esaminarli.

Ma mi è sembrato di poter essere in grado di fare questo risultato chmod- di modificare in modo ricorsivo i file in lettura / scrittura ma non di rendere le directory irreversibili. L'ho fatto nel modo "giusto" o esiste un modo più semplice per farlo?

Risposte:


12

La soluzione migliore dovrebbe essere

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

dove la capitale Xsignifica: impostare il bit di esecuzione if

il file è una directory o ha già i permessi di esecuzione per alcuni utenti

(citato dalla chmodpagina man).

O anche, se vuoi usare find

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

Ho usato la versione completamente aperta per tutti di questo comando per il mio disco rigido USB: chmod -v -R ugo = rwX / path Grazie!
The Dude,

Evidentemente non c'è modo senza usare findper impostare tutte le autorizzazioni per i file su 600 e tutte le autorizzazioni per le directory su 700. (Sono arrivato qui tramite i miei googlings sull'argomento.) Se ciò può essere fatto con un singolo chmod -Rcomando, sentiti libero di correggermi.
Wildcard il

@Wildcard: non esattamente, il comando chmod -R u=rwX,go= /pathfa quasi quello che vuoi: imposta tutte le directory su 700 e tutti i file su 600 o 700, a seconda che il bit di esecuzione sia già impostato o meno, e penso che questa sia la cosa giusta da fare .
enzotib,

1
@enzotib, sì, quasi, ma non del tutto. Nel mio caso, voglio disabilitare il bit di esecuzione per tutti i file (ma non per le directory ovviamente) indipendentemente dal fatto che siano script o binari o altro. Quindi il findcomando che hai scritto è stato molto utile come modello. :)
Wildcard il

@Wildcard che ne dici di rimuovere prima il bit di esecuzione, in modo ricorsivo, quindi aggiungerlo di nuovo solo alle directory usando il comando sopra?
Michael

3

L'uso di find è il modo "giusto" e l'unico modo programmatico, sebbene ci siano variazioni:

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

o

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

o il più lento:

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

Ognuno di questi seleziona un file (non directory, non link simbolico) e applica il chmodcomando su di esso. I primi due riducono il numero di chiamate chmodaggiungendo il file alla fine di una riga di comando interna ogni volta fino a raggiungere un massimo (spesso 10), quindi chiama il comando e inizia a ricostruire un nuovo comando. L'ultima istruzione genera un nuovo processo per ogni file, quindi è meno efficiente.

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.