리눅스 / 유닉스의 동일한 트리에 권한 복사


22

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

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

답변:


8

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

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 변수에 올바른 값을 설정하고 소스 및 대상 디렉토리를 가리키고 실행하면 디렉토리에 동기화 권한이 부여됩니다.


1
stat가 있다고 가정합니다. 안타깝게도 커맨드 스탯이없는 경우가 많습니다.
Mei

@David, 나는 통계가 부족한 그런 시스템을 모른다. 그러나 다음 "octal ls"버전을 사용하고 그에 따라 주어진 솔루션을 수용하는 것은 매우 사소한 일입니다. alias ols = "ls -la | awk '{k = 0; for (i = 0; i <= 8; i ++) k + = ((substr (\ $ 1, i + 2,1) ~ / [rwx] /) * 2 ^ (8-i)); if (k) printf (\ "% 0o \", k); print} ' "
drAlberT

휴식 어떤 관련 경로가 포함되어 있는 특수 문자 (공백, 대시 시작 등)의 종류.
n.st

31

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

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

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

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

setfacl --restore=/root/perms.acl

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

루트로 수행해야합니다.


이것은 권한을 백업하고 복원하는 매우 간단하고 간단한 방법입니다. 그러나주의 getfacl하고 setfacl반드시 모든 시스템에 존재하지 않습니다.
the-wabbit

.ac첫 번째 명령과 .acl두 번째 명령에있는 것이 맞 습니까?
sfarbota

1
@ sfarbota : 아니, 오타였습니다! 지금 수정되었습니다. 지적 해 주셔서 감사합니다.
marlar

13

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

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


1
타임 스탬프가 다른 경우 아니, 그것은 파일을 복사합니다
yawniek

@yawniek -r--perms는 중복 적이지만, 이것이 유일한 유일한 경우에도 여전히 동기화됩니다.
Chris S

좋아, 그때 불분명했다. 나는 나무 구조가 같다는 것을 의미했다.
yawniek

12

당신이 할 수있는 한 가지를 사용하는 것입니다 찾기 당신이 권한을 복사하는 데 필요한 명령을 스크립트를 구축하는 명령을 사용합니다. 다음은 간단한 예입니다. 소유자, 그룹 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
찾은 -printf 인수가 GNU 확장이라고 생각합니까? HP-UX find에는 없습니다.
Mei

1
printf 옵션을 찾지 않아도 ls 옵션 (또는 최악의 경우 xargs ls -l로 파이프)을 사용하여 파일에 저장할 수 있습니다. 1 분 또는 2 분의 검색 및 바꾸기, 하나는 각 파일에 대해 chmod가있는 스크립트를 갖습니다.
mpez0

0

두 가지 방법:

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

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

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


-a (아카이브의 경우)는 cp에 GNU 추가 기능이며 다른 시스템에서는 본 적이 없습니다. -dpR (짧은 참조, 재귀, 권한 유지)이 짧습니다. 는 R 및 P 옵션 CP의 모든 버전에 있어야합니다
theotherreceive

0

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

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

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


0

나는 이것을 생각해 냈다.

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.