2013-03-06 17 views
33

Mam dwie kopie tego samego drzewa katalogów. Mają prawie te same pliki w obu (jedna wersja może mieć kilka dodatkowych lub brakujących plików). Jednak większość plików jest wspólnych dla obu katalogów (mają te same względne ścieżki i wszystko).Kopiowanie uprawnień do plików, ale nie plików

siebie te znajdują się w katalogach:

version1/ 
version2/ 

Problem polega na tym, że uprawnienia w version1/ale zawiedli, i chciałbym, aby skopiować uprawnienia z Version2 /, ale robią to bez wymiany plików w wersji1/które są nowsze.

Czy jest to zautomatyzowany sposób przez bash? (Nie musi to być bash, może to być jakaś inna metoda/język programowania).

+0

Utworzyłem nowe pytanie w ServerFault dotyczące tego tematu: [Kopiuj uprawnienia do plików, ale nie pliki w systemie Unix] (http://serverfault.com/questions/665237/copy-file-permissions-but- not-files-in-unix) –

Odpowiedz

66

Trzeba zapoznać się z opcją --reference dla chmod:

chmod --reference version2/somefile version1/somefile 

Zastosuj find i xargs w sposób montażu i powinno być w porządku, to znaczy coś

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

Działa to nawet rekurencyjnie i jest odporny na brakujące pliki w katalogu docelowym (na pasku Brak takich plików ... błędów, które można zignorować). Oczywiście nie zrobi nic z plikami, które istnieją tylko w katalogu docelowym.

Cheers,

+0

Tylko dla conf irm, w powyższym poleceniu zmienia się wersja 2, aby pasowała do wersji 1, a nie odwrotnie? Wreszcie, jest odporny na brakujące pliki? – user788171

+1

Nie i nie, odpowiednio. –

+1

Aby opracować, kopiuje perms z bieżącego katalogu do wersji 1 i nie jestem pewien, czy 'xargs' będzie kontynuowany, jeśli nie ma pasującego pliku w katalogu docelowym - powinieneś przetestować przed uruchomieniem na twoim live FS. –

0

chmod właściciel-group-other ./dir lub ./file może?

Jeśli uprawnienia nie są drobnoziarniste i różne od jednego pliku do drugiego, można zrobić rekursywny chmod w katalogu i ujednolicić uprawnienia.

See man chmod o referencje na temat opcji, które mogą być użyteczne

7

Można użyć tego skryptu (zmienia uprawnienia rekurencyjnie ale indywidualnie dla każdego pliku/katalogu)

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

uruchomić skrypt z Argumenty version2 version1

Powiązane problemy