Самый простой способ - использовать инструменты ACL, даже если вы на самом деле не используете ACL.Просто вызовите getfacl -R . >saved-permissions
для резервного копирования разрешений дерева каталогов и setfacl --restore=saved-permissions
для их восстановления.
В противном случае способ резервного копирования разрешений - с помощью find -printf
.(GNU найти обязательно, но это то, что у вас есть в Linux.)
find -depth -printf '%m:%u:%g:%p\0' >saved-permissions
Вы получаете файл, содержащий записи, разделенные нулевым символом;каждая запись содержит числовые разрешения, имя пользователя, имя группы и имя файла для одного файла.Для восстановления переберите записи и вызовите chmod
и chown
.Параметр -depth
для find
используется в том случае, если вы хотите сделать некоторые каталоги недоступными для записи (сначала вам нужно обработать их содержимое).
Вы можете восстановить разрешения с помощью этого фрагмента bash, полученного из фрагмента, предоставленного Даниэль Алдер :
while IFS=: read -r -d '' mod user group file; do
chown -- "$user:$group" "$file"
chmod "$mod" "$file"
done <saved-permissions
Вы можете использовать следующий скрипт awk, чтобы преобразовать вывод find
в некоторый код оболочки для восстановления разрешений.
find -depth -printf '%m:%u:%g:%p\0' |
awk -v RS='\0' -F: '
BEGIN {
print "#!/bin/sh";
print "set -e";
q = "\047";
}
{
gsub(q, q q "\\" q);
f = $0;
sub(/^[^:]*:[^:]*:[^:]*:/, "", f);
print "chown --", q $2 ":" $3 q, q f q;
print "chmod", $1, q f q;
}' > restore-permissions.sh