다른 파일에서 소유권과 권한을 복제 하시겠습니까?


125

다른 파일에서 파일에 대한 사용자 / 그룹 소유권 및 권한을 복제하는 명령 또는 플래그가 있습니까? 파마와 소유권을 다른 파일과 정확히 일치 시키려면?

답변:


175

GNU / Linux에서 chownchmod--reference옵션을

chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile

1
내 질문에 대한 답변 으로이 답변을 인용하고 인용 할 수 있습니까 : unix.stackexchange.com/questions/44253/… ? , 나는 훌륭한 추가가 될 것이라고 생각하고 그것을 위해 투표를 찾고 싶습니다.
Grzegorz Wierzowiecki

@GrzegorzWierzowiecki : 아마도 그 질문은 닫아야하지만, 이것과 약간 다르고 이미 답변이 있으므로 아무것도하지 않는 것이 좋습니다.
enzotib

당신이 원하고 제안한대로. 도움을 주셔서 감사합니다, 나는에 관심을 넣어 적이없는 --reference의 매개 변수 chmodchown:) 전에.
Grzegorz Wierzowiecki

12

같은 (비 임베디드) 리눅스 나 Cygwin에서와 같은 유닉스 GNU와 유틸리티,에, 당신은 사용할 수 있습니다 chmod --referencechown --reference .

시스템에 ACL 이 있으면 ACL 명령 getfacl및을 시도하십시오 setfacl. 이러한 명령은 시스템마다 약간 씩 다르지만 많은 getfacl other_file | setfacl -bnM - file_to_change경우 권한을 복사하는 데 사용할 수 있습니다 . 소유권을 복사하지 않습니다. ls -l other_file공백을 포함하는 사용자 또는 그룹 이름이 없다고 가정하고 신중하게 구문 분석하여이를 수행 할 수 있습니다 .

LC_ALL=C ls -l other_file | {
  read -r permissions links user group stuff;
  chown -- "$user:$group" file_to_change
}
getfacl other_file | setfacl -bnM - file_to_change

1
ACL이 활성화 된 상태에서 ACL이 설치되고 파일 시스템이 마운트되어 있어야합니다.
enzotib

2
@enzotib 최소한 Linux에서는 소스 및 대상 파일 시스템이 ACL을 지원하지 않더라도 ACL 도구는 권한을 복사하지만 소유권은 복사하지 않습니다.
Gilles

7

습니까 bash는 명령 의 응답에 따라 마테오 :)

암호:

chmod $( stat -f '%p' "$1" ) "${@:2}"

용법:

cp-permissions <from> <to>...


5
에 가드! 어디에서 말하는 법을 배웠 ${*:2}습니까? 다시는 그렇게하지 마십시오! 파일 이름에 공백이 있거나 탭이 있으면 실패합니다. 사용하십시오 "${@:2}". 또한 "$1"그냥 대신 사용하십시오 $1.
G-Man

chmod "$(stat -c '%a' "$fromfile")" tofileGNU로 coreutils에,하지만 당신은뿐만 아니라 사용할 수 있습니다 --reference때문에이 경우 statCLI 유틸리티 POSIX없는, 심지어는 말한다 pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.htmlthat는 ls -l "LS의 출력을 : 그것을 잘라하지 않습니다 (-l 및 관련 옵션 사용)에는 chmod 및 touch와 같은 유틸리티에서 논리적으로 사용하여 알려진 상태로 파일을 복원 할 수있는 정보가 포함되어 있지만,이 정보는 해당 유틸리티에서 직접 사용할 수없는 형식으로 제공되거나 "사용할 수있는 형식으로 쉽게 번역됩니다."
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

5

GNU의 chmod / chown ( --reference옵션 을 지원하는 )이 있는 시스템을 사용하지 않는 경우 다음 의 출력을 구문 분석 할 수 있습니다.ls -l

여기에 작은 스크립트가 있습니다 chmod(확장 정규식을 지원하는 것을 볼 수 있다면 훨씬 더 읽기 쉬운 방식으로 쓰여질 수 있습니다 ...)

#!/bin/sh

reference=$1
shift
files=$*

# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/"       | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/"    | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}

업데이트 :

이것은 다음을 사용하여 훨씬 쉽습니다 stat.

chmod $( stat -f '%p' ${reference} ) ${files}

2
ls -l출력 을 구문 분석하는 대신 출력 을 구문 분석 할 수 있습니다 stat.
jfg956

@ jfgagne : 감사합니다. 왜 처음에 그것에 대해 생각하지 않았는지 모르겠습니다. 답변을 업데이트했습니다
Matteo

1
stat여기서 * BSD 구문을 사용하고 있습니다. 당신의 chmod $(stat ...)명령 때문에 작동하지 않습니다 %p* BSD의 혼자 출력 너무 많은 정보를 chmod사용하는 %Lp출력에 바로 U / g / O를 비트. sticky / setuid / setgid 비트에는 약간 더 정교한 것이 필요합니다.
mr.spuratic 2016 년

0

Matteo 의 스크립트에 조정을 추가하고 싶었습니다 . 파일에서 chmod 명령을 실제로 실행하기 전에 파일이 존재하는지 확인하려면 for 루프를 사용해야합니다. 이렇게하면 스크립트 오류가 더 정상적으로 나타납니다.

솔라리스, 리눅스 등과 같은 모든 * nix OS에 사용될 수 있기 때문에 이것이 최선의 선택이라고 생각합니다.

#!/bin/sh

reference=$1
shift
files=$*

for file in $reference $files; do
  [ -f $file ] || { echo "$file does not exist"; exit 1; }
done

# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}

내 Solaris 10 시스템 중 하나에서 stat찾을 수 없음을 발견했습니다. 그래도 구성에 문제가있을 수 있습니다.


0

이것은 나를 위해 작동합니다 :

cp -p --attributes-only <from> <to>

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