Chmod ricorsivo: rw per i file, rwx per le directory


28

Voglio chmodmolti file e directory. Come xindica l'elenco per le directory ed eseguire per i file regolari, vorrei fare domanda rwper i file e rwxper le directory. È possibile usare solo il chmodcomando?

In caso contrario, qual è il modo più conveniente?

Fare un chmod -R 770non è una possibilità in quanto non voglio che i file normali diventino eseguibili.


1
Vuoi davvero il permesso di scrittura pubblica su file e directory? Ciò significa che non ti importa chi ti blocca nessuno dei file?
Jonathan Leffler,

Vero. L'ho cambiato sopra.
Eliminato il

Risposte:


19

Lo faccio occasionalmente usando un solo findcomando. Brutto ma efficace.

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

"{}" Non deve essere citato, nel caso in cui i percorsi contengano spazi? Mi piace find . -type d -exec chmod -vc 755 "{}" \;(incluso -vcper alcuni feedback). (E forse, solo per chiarire, aggiungere anche i due comandi autonomi alla risposta?)
Arjan,

No, {} non ha bisogno di essere citato (ho appena testato per essere assolutamente certo). Quando find inserisce {} nel comando, viene correttamente evaso. Non ho cercato il funzionamento interno di find, ma suppongo che crei un array di argomenti da passare a exec () e che strcpy () il nome file nell'array. Quando chmod esamina i suoi argomenti, appare correttamente.
baumgart,

37

Usa l'autorizzazione X, dalla pagina man:

I bit di esecuzione / ricerca se il file è una directory o uno dei bit di esecuzione / ricerca sono impostati nella modalità originale (non modificata). Le operazioni con il simbolo perm "X" sono significative solo in combinazione con il simbolo op "+" e vengono ignorate in tutti gli altri casi.

Quindi, procedi come segue:

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

Ciò rimuove il bit di esecuzione da tutti i file e directory seguito dall'aggiunta di privilegi di lettura e scrittura a tutto, ed esegue i privilegi solo sulle directory. (Nessun file regolare ha più il bit di esecuzione attivo dal primo passaggio.)


1
questo non imporrà la modalità 666 su file normali. non cancella il bit eseguibile per i file regolari se lo hanno già impostato.
Quack Quixote,

Quindi in quel caso potresti farlo chmod -R a-x [directory]seguito da chmod -R a+rwX [directory]?
jwaddell,

@jwaddel: dovrebbe funzionare. Stai rimuovendo tutti i bit di esecuzione, indipendentemente dal tipo di file / directory, quindi aggiungi esegui solo alle directory e ai file regolari su cui è già presente il bit di esecuzione (che ora non è nessuno.)
Ben S

Una volta fatto a-x, la directory non è accessibile. In effetti, chmod fallisce con il permesso negato e non rimuoverà il bit eseguibile dai file all'interno della directory. C'è un modo per farlo senza essere root?
avakar

14

Puoi anche usare findinsieme a xargs:

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

dove -typespecifica d irectory o f ile.


1
Xargs non ha un limite di lunghezza? Sono MOLTI file e directory.
Eliminato il

2
Prima farei le directory, poi i file. Altrimenti, rischi di perdere qualche sottostruttura a causa della mancanza di autorizzazione. Inoltre, dovresti controllare se l'elenco è esplorato prima o dopo il chmod, altrimenti, come sopra. E sì, mi asterrei dall'usare xargs.
Stefano Borini,

1
xargsè abbastanza intelligente da spezzare lunghe righe di comando in più esecuzioni. Consulta la tua manpage xargs e assicurati di controllare xargs --show-limits.
Mike,
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.