2009-07-22 3 views
53

Ho bisogno di usare chmod per cambiare tutti i file in modo ricorsivo in 664. Vorrei saltare le cartelle. Stavo pensando di fare qualcosa di similecambiando chmod per i file ma non per le directory

ls -lR | grep ^-r | chmod 664 

Questo non funziona, sto assumendo perché non riesco a tubo nel chmod Qualcuno sa di un modo semplice per fare questo?

Grazie

+1

questo dovrebbe essere chiesto in ServerFault – MoshiBin

+0

chmod in realtà dovrebbe essere in grado di distinguere tra i file, collegamenti e cartelle su di essa la propria. – Xeoncross

risposta

82

A find -exec La risposta è buona, ma soffre del problema di solito irrilevante che crea un sottoprocesso separato per ogni singolo file. Tuttavia è perfettamente funzionante e funzionerà male solo quando il numero di file diventa veramente grande. L'utilizzo di xargs consente di raggruppare i nomi dei file in gruppi di grandi dimensioni prima di eseguire un sottoprocesso per il gruppo di file.

Devi solo fare attenzione che, usando xargs, gestisci correttamente i nomi di file con spazi, righe nuove o altri caratteri speciali incorporati.

Una soluzione che risolve entrambi i problemi è (ammesso che abbiate un abbastanza decente find e xargs implementazione):

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

I -print0 cause find di annullare i nomi dei file sul proprio flusso di output con un carattere NUL (piuttosto che uno spazio) e lo -0 a xargs fa sapere che dovrebbe aspettarselo come formato di input.

+0

Questo è ottimo per trovare GNU, ma sfortunatamente -print0 e xargs -0 non sono standard e non funzionano ad es. su Solaris. Quindi in tal caso usa una delle altre soluzioni. – mark4o

+1

Posso confermare che questo metodo funziona su Mac OSX (almeno 10.9). –

+0

@ mark4o, non sei limitato a utilizzare le versioni braindead fornite con Solaris. Un grande vantaggio di FOSS è che puoi portarlo su qualsiasi OS abbastanza vicino (UNIXy). L'ho fatto spesso per AIX per versione 5L. – paxdiablo

27

Un altro modo per farlo è quello di utilizzare find ... -exec ... come segue:

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

Il problema è che il -exec avvia un processo chmod per ogni file. L'approccio xargs evita questo ed è superiore a condizione che si disponga di una versione di find e xargs in grado di far fronte al problema "spazi in percorsi"; vedere la risposta accettata.

E per la cronologia, l'utilizzo di back-ticks si interrompe se ci sono troppi file da codificare, o la lunghezza aggregata dei percorsi è troppo grande.

+1

qual'è la differenza tra \ e '+'? –

+2

@HowChen - Leggi 'man find'. –

+2

In realtà ... è la differenza tra ';' e '+;'. Il backslash è l'escaping della shell. –

2

con GNU trovare

find /path -type f -exec chmod 644 {} +;

13

miei succinte due centesimi ...

Linux:

$ chmod 644 `find -type f` 

OSX:

$ chmod 644 `find . -type f` 

Questo funziona per cambiare in modo ricorsivo tutti i file contenuti nella directory corrente e tutte le sue sottodirectory. Se si desidera raggiungere una directory diversa, sostituire . con il percorso corretto:

$ chmod 644 `find /home/my/special/folder -type f` 
+0

come si specifica quale directory? –

+1

La mia risposta originale riguardava ciò che l'OP aveva chiesto: modifica ricorsiva di tutti i file nella directory corrente. Vedi la mia modifica su come applicarla a qualsiasi directory, non solo a quella attuale. –

+1

Grazie per la soluzione più semplice e più immediata – asherrard