파일 권한을 복사하지만 Unix의 파일은 복사하지 않습니다


14

(From : /programming/15245144/copy-file-permissions-but-not-files , 주제를 벗어 났으므로 닫힘)

동일한 디렉토리 트리의 사본이 두 개 있습니다. 두 파일 모두 거의 동일한 파일을 가지고 있습니다 (한 버전에는 몇 개의 추가 파일이 있거나 누락 된 파일이있을 수 있음). 그러나 대부분의 파일은 두 디렉토리 모두에 공통입니다 (동일한 상대 경로와 모든 경로를 가짐).

이들이 디렉토리에 있다고 가정하십시오.

version1/
version2/

문제는 version1 /의 권한이 엉망이어서 version2 /의 권한을 복사하고 싶지만 version1 /의 파일을 최신 버전으로 바꾸지 않고 수행한다는 것입니다.

쉘 명령이나 스크립트를 통해 자동으로 수행 할 수있는 방법이 있습니까?


답변:


15

coreutils 8.6--attributes-only 이후 GNU cp가 플래그를 알고 있습니다.

-속성 전용 파일 데이터를 복사하지 않고 속성 만


1
내 버전에는 해당 플래그가없는 것
shearn89

14

내 버전 cp에는 --attributes-only깃발이 없으므로이 작업을 수행했습니다. 간단한 폴더 YMMV에서 간단히 테스트했습니다.

$> ls
version1/
version2/
$> ls -l version1/1/a
-rw-rw-r-- 1 alex alex 0 Feb  5 12:49 version1/1/a
$> ls -l version2/1/a
-rwxrwxrwx 1 alex alex 0 Feb  5 12:49 version1/1/a

$> find version1 -type f -printf '%P\n' | xargs -I {} \
    chmod --reference=version1/{} version2/{}

$> ls -l version2/1/a
-rw-rw-r-- 1 alex alex 0 Feb  5 12:49 version1/1/a

5

당신은 할 수 있지만 "자동화 된 방식으로"생각하지 않습니다!

GNU chown과 GNU chmod에는 --reference=RFILE사용할 수 있는 매개 변수가 있습니다.

chown --reference=RFILE yourfile
chmod --reference=RFILE yourfile

사용합니다 RFILE 설정 (권한, 소유자, 그룹 등) 복사 그들에를 yourfile.

설명서에 자세한 내용이 설명되어 있습니다.


0

제 경우에는 "find"및 "vi"와 함께 "stat"명령을 사용하여 권한을 적용하는 스크립트를 작성하여 해결했습니다.

cd version1/
find . -exec stat -c '%a %n' "{}" \; > setPerm.sh
vi setPerm.sh

"vi"에 "chmod"명령을 모든 행에 삽입 했습니다. %s/^/chmod /g 스크립트를 version2/디렉토리에 복사하여 실행했습니다.

다른 솔루션은 유효 해 보이지만 경우에 따라 테스트하지는 않았습니다.


0

Mariano Paniga의 답변에서 영감을 얻은 결과 명령을 vi / 검색하거나 바꿀 필요가없는 더 나은 방법이 있다고 생각합니다. 소유권 정보도 복사하고 싶습니다 (uid / gid).

cd version1/
find . -exec stat -c 'chmod %a %n; chown %U:%G %n' "{}" \; > /tmp/setPerm.sh
chmod u+x /tmp/setPerm.sh
cd ../version2
/tmp/setPerm.sh

내부에서 명령 stat -c '...'을 원하는대로 사용자 정의 할 수 있습니다 . 사용 가능한 모든 옵션에 대해서는를 참조하십시오 man stat.


스크립트가 개행 문자가 포함 된 이름을 처리합니까?
사슴 사냥꾼

@ deer-hunter 그대로 작동해야합니다. 그렇지 않은 경우 파일 이름 부분에 따옴표 ".."를 추가 할 수 있습니다.
Tomofumi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.