답변:
GNU / Linux에서 chown
와 chmod
이 --reference
옵션을
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--reference
의 매개 변수 chmod
및 chown
:) 전에.
같은 (비 임베디드) 리눅스 나 Cygwin에서와 같은 유닉스 GNU와 유틸리티,에, 당신은 사용할 수 있습니다 chmod --reference
및chown --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
암호:
chmod $( stat -f '%p' "$1" ) "${@:2}"
용법:
cp-permissions <from> <to>...
${*:2}
습니까? 다시는 그렇게하지 마십시오! 파일 이름에 공백이 있거나 탭이 있으면 실패합니다. 사용하십시오 "${@:2}"
. 또한 "$1"
그냥 대신 사용하십시오 $1
.
chmod "$(stat -c '%a' "$fromfile")" tofile
GNU로 coreutils에,하지만 당신은뿐만 아니라 사용할 수 있습니다 --reference
때문에이 경우 stat
CLI 유틸리티 POSIX없는, 심지어는 말한다 pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.htmlthat는 ls -l
"LS의 출력을 : 그것을 잘라하지 않습니다 (-l 및 관련 옵션 사용)에는 chmod 및 touch와 같은 유틸리티에서 논리적으로 사용하여 알려진 상태로 파일을 복원 할 수있는 정보가 포함되어 있지만,이 정보는 해당 유틸리티에서 직접 사용할 수없는 형식으로 제공되거나 "사용할 수있는 형식으로 쉽게 번역됩니다."
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}
ls -l
출력 을 구문 분석하는 대신 출력 을 구문 분석 할 수 있습니다 stat
.
stat
여기서 * BSD 구문을 사용하고 있습니다. 당신의 chmod $(stat ...)
명령 때문에 작동하지 않습니다 %p
* BSD의 혼자 출력 너무 많은 정보를 chmod
사용하는 %Lp
출력에 바로 U / g / O를 비트. sticky / setuid / setgid 비트에는 약간 더 정교한 것이 필요합니다.
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
찾을 수 없음을 발견했습니다. 그래도 구성에 문제가있을 수 있습니다.