리눅스 / 유닉스의 동일한 트리에 권한 복사 파일 트리가 있습니다. 그런 다음 잘못된 권한을

올바른 권한을 가진 파일 트리가 있습니다. 그런 다음 잘못된 권한을 가진 (파일 방식의) 동일한 트리 (다른 파일 내용으로 힘든)가 있습니다.

한 트리에서 다른 트리로 권한 레이아웃을 어떻게 전송할 수 있습니까?



답변

다음 쉘 라인으로 수행 할 수 있습니다.

D1=foo; D2=foo2; for entry in $(find $D1  -exec stat -f "%N:%Mp%Lp" {} \;); do $(echo $entry | sed 's#'$D1'#'$D2'#' | awk -F: '{printf ("chmod %s %s\n", $2, $1)}') ; done

D1 및 D2 변수에 올바른 값을 설정하고 소스 및 대상 디렉토리를 가리키고 실행하면 디렉토리에 동기화 권한이 부여됩니다.


답변

나는 이것을 달성하는 새롭고 간단한 방법을 배웠다.

getfacl -R /path/to/source > /root/perms.acl

모든 권한과 소유권이있는 목록이 생성됩니다.

그런 다음 대상 의 한 수준으로 이동하여

setfacl --restore=/root/perms.acl

perms.acl의 모든 경로가 상대적이기 때문에 한 수준 이상이어야하는 이유입니다.

루트로 수행해야합니다.


답변

소스와 대상이있는 경우 권한을 다음과 동기화 할 수 있습니다.
rsync -ar --perms source/ dest

데이터를 전송하지 않고 권한 만 …


답변

당신이 할 수있는 한 가지를 사용하는 것입니다 찾기 당신이 권한을 복사하는 데 필요한 명령을 스크립트를 구축하는 명령을 사용합니다. 다음은 간단한 예입니다. 소유자, 그룹 ID 등을 포함한 다양한 printf 옵션으로 더 많은 작업을 수행 할 수 있습니다.

$ find /var/log -type d -printf "chmod %m %p \n" > reset_perms
$ cat reset_perms
chmod 755 /var/log
chmod 755 /var/log/apt
chmod 750 /var/log/apache2
chmod 755 /var/log/fsck
chmod 755 /var/log/gdm
chmod 755 /var/log/cups
chmod 2750 /var/log/exim4
...


답변

두 가지 방법:

  1. UNIX 브랜드에서 작동하는 경우 : cp -ax / src / dest
  2. 또는 그렇지 않은 경우 휴대용 버전입니다. (cd / src && tar cpf-.) | (cd / dst && tar xpf-)

(후자의 경우 / dst가 존재해야 함)

편집 : 죄송합니다, 잘못 읽었습니다. 당신이 요구 한 것이 아닙니다.


답변

나는 그것을하기 위해 펄 스크립트를 작성할 것이라고 생각한다. 다음과 같은 것 :

#!/usr/bin/perl -nw

my $dir = $_;
my $mode = stat($dir)[2];
my $pathfix = "/some/path/to/fix/";
chmod $mode, $pathfix . $dir;

그런 다음 다음과 같이하십시오.

cd /some/old/orig/path/ ; find . -type d | perlscript

나는 이것을 내 머리 꼭대기에 썼으며 테스트되지 않았다. 만연하기 전에 확인하십시오. 존재하는 디렉토리에 대한 권한 만 수정합니다. 파일에 대한 권한을 변경하지 않으며 누락 된 디렉토리를 만들지 않습니다.


답변

나는 이것을 생각해 냈다.

find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh

완벽한 방탄은 아니지만 필요한 것을 수행합니다.