답변:
다음 쉘 라인으로 수행 할 수 있습니다.
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의 모든 경로가 상대적이기 때문에 한 수준 이상이어야하는 이유입니다.
루트로 수행해야합니다.
getfacl
하고 setfacl
반드시 모든 시스템에 존재하지 않습니다.
.ac
첫 번째 명령과 .acl
두 번째 명령에있는 것이 맞 습니까?
당신이 할 수있는 한 가지를 사용하는 것입니다 찾기 당신이 권한을 복사하는 데 필요한 명령을 스크립트를 구축하는 명령을 사용합니다. 다음은 간단한 예입니다. 소유자, 그룹 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
...
두 가지 방법:
(후자의 경우 / 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
나는 이것을 내 머리 꼭대기에 썼으며 테스트되지 않았다. 만연하기 전에 확인하십시오. 존재하는 디렉토리에 대한 권한 만 수정합니다. 파일에 대한 권한을 변경하지 않으며 누락 된 디렉토리를 만들지 않습니다.