2013-11-02 16 views
30

perché non questo lavoro che sto cercando di cambiare tutti i file a 644 abd tutto -d per 755:trovare. -tipo f -exec chmod 644 {};

find . -type f -exec chmod 644 {} ; 

ottengo: trovare: manca argomento `exec' grazie

+4

Termina con '\;' non con ' ; 'da solo. –

+3

... perché tutto ciò che segue '-exec' viene trattato come argomento. Se tu avessi un '' 'sarebbe stato trattato come un terminatore per l'intero' find', ma in realtà hai bisogno di terminare 'exec', quindi deve essere salvato come parte della stringa argomento. –

+0

possibile duplicato di [Come impostare chmod per una cartella e tutte le relative sottocartelle e file in Linux Ubuntu Terminal?] (Http://stackoverflow.com/questions/3740152/how-to-set-chmod-for-a- cartella-e-tutte-delle-sue-sottocartelle-e-file-in-linux-ubunt) –

risposta

11

Una buona alternativa è questa:

find . -type f | xargs chmod -v 644 

e per le directory:

find . -type d | xargs chmod -v 755 

e ad essere più esplicito:

find . -type f | xargs -I{} chmod -v 644 {} 
+0

Come gestire i file trovati che hanno spazi? Ricevo errori, il nome del file è suddiviso in spazi e tenta di eseguire chmod per ogni parte suddivisa. – Lidia

+0

@Lidia, prova ad usare l'opzione '-print0' per trovare e' xargs -0'. – TAllieri

+0

@TAllieri Grazie mille – Lidia

90

Piping a xargs è un modo sporco di fare quello che può essere fatto all'interno di find.

find . -type d -exec chmod 0755 {} \; 
find . -type f -exec chmod 0644 {} \; 

Si può essere ancora più controllo con altre opzioni, come ad esempio:

find . -type d -user harry -exec chown daisy {} \; 

si possono fare alcune cose molto interessanti con find e si può fare alcune cose molto pericolosi anche. Dai un'occhiata a "man find", è lunga ma vale una lettura veloce. E, come sempre ricorda:

  • Se sei root ci riuscirai.
  • Se sei in root (/) hai una brutta giornata.
  • L'utilizzo di/path/to/directory può rendere le cose molto più sicure in quanto si sta chiaramente definendo dove si desidera eseguire la ricerca.
+2

Perché il metodo xargs dovrebbe essere "sporco"? Ha l'enorme vantaggio di eseguire chmod solo una volta, con tutti i file come argomenti. Il metodo "-exec chmod" creerà un sottoprocesso per file. –

+0

Se vuoi eseguire solo chmod una volta, cambialo in 'find. -tipo f -exec chmod 0644 {} + 'che funziona essenzialmente come il metodo xargs, costruendo una riga di comando. (Il \ sopra è solo per sfuggire al punto e virgola). – johnthacker

+0

Quick oneliner: 'find. -type d -exec chmod 0755 {} \; && trova . -tipo f -exec chmod 0644 {} \; ' – lucaferrario

1

Ho bisogno di questo così spesso che ho creato una funzione nel mio ~/.bashrc di file:

chmodf() { 
     find $2 -type f -exec chmod $1 {} \; 
} 
chmodd() { 
     find $2 -type d -exec chmod $1 {} \; 
} 

ora posso usare queste scorciatoie:

chmodd 0775 . 
chmodf 0664 .