2013-03-06 13 views
33

Ho due copie dello stesso albero di directory. Hanno quasi gli stessi file in entrambi (una versione potrebbe avere un paio di file in più o mancanti). Tuttavia, la maggior parte dei file sono comuni a entrambe le directory (hanno gli stessi percorsi relativi e tutto il resto).Copia autorizzazioni file, ma non file

assumere questi sono in directory:

version1/ 
version2/ 

Il problema è che le autorizzazioni nel version1/GOT incasinato, e vorrei copiare le autorizzazioni dalla Version2 /, ma farlo senza sostituire i file in version1/che sono più recenti.

Esiste un modo automatico per farlo tramite bash? (Non deve essere bash, potrebbe anche essere un altro metodo/linguaggio di programmazione).

+0

Ho creato una nuova domanda in ServerFault correlata a questo argomento: [Copia i permessi dei file, ma non i file in Unix] (http://serverfault.com/questions/665237/copy-file-permissions-but- not-files-in-unix) –

risposta

66

Si dovrebbe avere uno sguardo a scelta --reference per chmod:

chmod --reference version2/somefile version1/somefile 

Applicare find e xargs in modo appropriato e si dovrebbe andare bene, vale a dire qualcosa come

~/version2$ find . -type f | xargs -I {} chmod --reference {} ../version1/{} 

Questo anche opere ricorsivamente, ed è robusto contro i file mancanti nella directory di destinazione (barra il Nessun file di questo tipo ... errori, che possono essere ignorati). Ovviamente non farà nulla ai file che esistono solo nella directory di destinazione.

Cheers,

+0

Solo per conf irm, nel comando precedente, sta cambiando la versione 2 per abbinare la versione 1 e non viceversa corretta? Infine, questo è robusto contro i file mancanti? – user788171

+1

No e no, rispettivamente. –

+1

Per elaborare, copia i permanenti dalla directory corrente a version1, e non sono sicuro che 'xargs' continuerà se non ci sono file corrispondenti nella directory di destinazione - dovresti testare prima di eseguire sul tuo live FS. –

0

chmod proprietario-gruppo-altro ./dir o ./file forse?

A meno che le autorizzazioni non siano granulose e diverse da un file all'altro, è possibile eseguire un chmod ricorsivo nella directory e unificare le autorizzazioni.

Vedere man chmod per i riferimenti sulle opzioni che potrebbero essere utili

7

È possibile utilizzare questo script (cambia i permessi in modo ricorsivo, ma individualmente per ogni file/directory)

#!/bin/sh 
chmod --reference $1 $2 
if [ -d $1 ] 
then 
    if [ "x`ls $1`" != "x" ] 
    then 
     for f in `ls $1` 
     do 
      $0 $1/$f $2/$f 
     done 
    fi 
fi 

Eseguire lo script con argomenti version2 version1