Come chmod tutte le directory tranne i file (ricorsivamente)?

Come chmod 755 tutte le directory, ma nessun file (ricorsivo)?

Inversa, come solo file chmod (ricorsivamente) ma nessuna directory?

Per fornire in modo ricorsivo le directory leggere ed eseguire i privilegi:

find /path/to/base/dir -type d -exec chmod 755 {} + 

Per consentire ai file di recuperare i privilegi di lettura:

 find /path/to/base/dir -type f -exec chmod 644 {} + 

Oppure, se ci sono molti oggetti da elaborare:

 chmod 755 $(find /path/to/base/dir -type d) chmod 644 $(find /path/to/base/dir -type f) 

Oppure, per ridurre la riproduzione di chmod :

 find /path/to/base/dir -type d -print0 | xargs -0 chmod 755 find /path/to/base/dir -type f -print0 | xargs -0 chmod 644 

Un motivo comune per questo tipo di cose è quello di impostare le directory a 755, ma i file a 644. In questo caso c'è un modo leggermente più veloce di quello di find Nik:

 chmod -R u+rwX,go+rX,go-w /path 

Senso:

  • -R = ricorsivo;
  • u+rwX = Gli utenti possono leggere, scrivere ed eseguire;
  • go+rX = gruppo e altri possono leggere ed eseguire;
  • go-w = gruppo e altri non possono scrivere

La cosa importnte da notare è che la maiuscola X agisce in modo diverso rispetto a minuscola x . Nel manuale si può leggere:

I bit di esecuzione / ricerca se il file è una directory o uno qualsiasi dei bit di esecuzione / ricerca sono impostati nella modalità originale (non modificata).

In altre parole, chmod u + X su un file non imposterà il bit di esecuzione; e g + X imposta solo se è già impostato per l'utente.

Se si desidera assicurarsi che i file siano impostati su 644 e ci sono file nel path che hanno la bolla di esecuzione, sarà necessario rimuovere prima la bolla di esecuzione. + X non rimuove la bacheca di esecuzione da file che lo hanno già.

Esempio:

 chmod -R ugo-x,u+rwX,go+rX,go-w path 

Aggiornamento: questo sembra fallire perché la prima modifica (ugo-x) rende la directory non eseguibile, quindi tutti i file sotto di esso non vengono modificati.

Ho deciso di scrivere un piccolo script per questo io stesso.

Script ricorrente chmod per dirs e / o file – Gist

Fondamentalmente fa il chmod ricorsivo, ma fornisce anche un po 'di flessibilità per le opzioni di row di command (imposta le directory e / o le autorizzazioni di file, oppure esclude entrambi, ripristina automaticamente tutto a 755-644). Controlla anche alcuni scenari di errore.

Ho anche scritto su questo sul mio blog .

Prova questo script python; non richiede alcuna spawning dei processi e fa solo due syscalls per file. A parte un'implementazione in C, probabilmente sarà il modo più veloce di farlo (ho dovuto fissare un filesystem di 15 milioni di file che erano tutti impostati su 777)

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

Nel mio caso, è stato richiesto un tentativo / catch per l'ultimo chmod, poiché il file chmodding di alcuni file speciali non è riuscito.

Per fornire in modo ricorsivo le directory "leggere" e "eseguire" i privilegi:

 find /directory-path -type d -exec sudo chmod 2775 {} + 

È ansible utilizzare il seguente script bash come esempio. Assicurarsi di darle autorizzazioni eseguibili (755). Utilizza semplicemente ./autochmod.sh per la directory corrente, oppure ./autochmod.sh <dir> per specificare un altro.

 #!/bin/bash if [ -e $1 ]; then if [ -d $1 ];then dir=$1 else echo "No such directory: $1" exit fi else dir="./" fi for f in $(ls -l $dir | awk '{print $8}'); do if [ -d $f ];then chmod 755 $f else chmod 644 $f fi done