用于递归检查目录的权限和所有者并编写 shell 脚本来重新创建它们的脚本

用于递归检查目录的权限和所有者并编写 shell 脚本来重新创建它们的脚本

我正在尝试编写一个 shell 脚本来保留和重写具有多个子目录的大目录中的所有权限/组,以防它们被更改或未正确创建,或者在不同的计算机上镜像此目录的用户/权限。

就像是:

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选项,以便在运行生成的 shell 脚本时,您可以看到命令的成功/错误:

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,它“监听文件系统事件”,例如文件权限的更改。在基于 debian 的操作系统上,它位于 package 中inotify-tools

相关内容