변경되거나 제대로 생성되지 않거나 이 디렉터리에 대한 사용자/권한을 다른 컴퓨터에 미러링하는 경우 여러 하위 디렉터리가 있는 큰 디렉터리의 모든 권한/그룹을 보존하고 다시 작성하기 위한 쉘 스크립트를 작성하려고 합니다.
다음과 같은 것 :
chown adam:brown /var/blarg
chmod 770 /var/blarg
chown adam:brown /var/blarg/toast.file
chmod 777 /var/blarg/toast.file
...etc
이것을 손으로 하면 시간이 오래 걸립니다. 이 작업을 수행하기 위한 기존 명령/스크립트가 있는지 궁금합니다.
답변1
@yeti 님의 댓글을 따라 얼마 전에 이것에 대해 생각해 보았고 다음과 같은 결론에 도달했던 것을 기억하는 것 같습니다.
find /path/to/dir -printf '%m\t%u\t%g\t%p\0' > filelist
그런 다음
while read -rd $'\0' perms user group file; do
if [ -e "$file" ]; then
chown "$user:$group" "$file"
chmod "$perms" "$file"
else
echo "warning: $file not found"
fi
done < filelist
작동 할 것이다. 출력의 마지막에 파일 이름을 넣고 read
개행 대신 null 종결자를 사용합니다.~해야 한다공백이나 기타 특수 문자가 포함된 파일 이름에도 안전합니다. 두 번째 명령을 실행하려는 위치에 따라 명령의 선행 구성 요소가 제거된 파일 이름을 사용하는 것이 더 편리 할 /path/to/dir
수 find
있습니다 .%P
%p
답변2
Yeti가 의견에서 제안한 대로 find 명령을 사용하여 디렉터리 내의 모든 파일과 디렉터리를 찾고 해당 권한/소유자를 chown 또는 chmod 명령으로 출력했습니다. -v
결과 쉘 스크립트를 실행할 때 명령의 성공/오류를 볼 수 있도록 자세한 옵션을 추가했습니다 .
find /var/blarg -printf 'chown -v %u:%g %p\n' > chowns.sh
find /var/blarg -printf 'chmod -v %m %p\n' > chmods.sh
이제 결과 .sh 파일을 실행 가능하게 만드십시오.
chmod +x chowns.sh; chmod +x chmods.sh
그런 다음 이를 실행하고 자세한 피드백을 txt 파일로 출력합니다.
./chmods > chmods_results.txt
팔.
답변3
당신이 언급한 events
경우,정말많은 파일을 살펴보는 것이 좋습니다. inotifywatch
예를 들어 파일 권한 변경과 같은 "파일 시스템 이벤트를 수신하는" 을 살펴보는 것이 좋습니다 . 데비안 기반 OS에서는 package 에 있습니다 inotify-tools
.