올바른 권한을 가진 파일 트리가 있습니다. 그런 다음 잘못된 권한을 가진 (파일 방식의) 동일한 트리 (다른 파일 내용으로 힘든)가 있습니다.
한 트리에서 다른 트리로 권한 레이아웃을 어떻게 전송할 수 있습니까?
답변
다음 쉘 라인으로 수행 할 수 있습니다.
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
...
답변
두 가지 방법:
- UNIX 브랜드에서 작동하는 경우 : cp -ax / src / dest
- 또는 그렇지 않은 경우 휴대용 버전입니다. (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
완벽한 방탄은 아니지만 필요한 것을 수행합니다.