(From : /programming/15245144/copy-file-permissions-but-not-files , 주제를 벗어 났으므로 닫힘)
동일한 디렉토리 트리의 사본이 두 개 있습니다. 두 파일 모두 거의 동일한 파일을 가지고 있습니다 (한 버전에는 몇 개의 추가 파일이 있거나 누락 된 파일이있을 수 있음). 그러나 대부분의 파일은 두 디렉토리 모두에 공통입니다 (동일한 상대 경로와 모든 경로를 가짐).
이들이 디렉토리에 있다고 가정하십시오.
version1/
version2/
문제는 version1 /의 권한이 엉망이어서 version2 /의 권한을 복사하고 싶지만 version1 /의 파일을 최신 버전으로 바꾸지 않고 수행한다는 것입니다.
쉘 명령이나 스크립트를 통해 자동으로 수행 할 수있는 방법이 있습니까?
답변
coreutils 8.6--attributes-only
이후 GNU cp가 플래그를 알고 있습니다.
-속성 전용 파일 데이터를 복사하지 않고 속성 만
답변
내 버전 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
답변
당신은 할 수 있지만 “자동화 된 방식으로”생각하지 않습니다!
GNU chown과 GNU chmod에는 --reference=RFILE
사용할 수 있는 매개 변수가 있습니다.
chown --reference=RFILE yourfile
chmod --reference=RFILE yourfile
사용합니다 RFILE
설정 (권한, 소유자, 그룹 등) 복사 그들에를 yourfile
.
설명서에 자세한 내용이 설명되어 있습니다.
답변
제 경우에는 “find”및 “vi”와 함께 “stat”명령을 사용하여 권한을 적용하는 스크립트를 작성하여 해결했습니다.
cd version1/
find . -exec stat -c '%a %n' "{}" \; > setPerm.sh
vi setPerm.sh
“vi”에 “chmod”명령을 모든 행에 삽입 했습니다. %s/^/chmod /g
스크립트를 version2/
디렉토리에 복사하여 실행했습니다.
다른 솔루션은 유효 해 보이지만 경우에 따라 테스트하지는 않았습니다.
답변
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
.