Назад | Перейти на главную страницу

Копирование разрешений в идентичное дерево в linux / unix

у меня есть дерево файлов с правильными разрешениями. тогда у меня есть (файловое) идентичное дерево (с разным содержимым файла) с неправильными разрешениями.

как перенести макет разрешений из одного дерева в другое?

Я только что узнал новый и простой способ добиться этого:

getfacl -R /path/to/source > /root/perms.acl

Это сгенерирует список со всеми разрешениями и владельцами.

Затем перейдите на один уровень выше место назначения и восстановить разрешения с помощью

setfacl --restore=/root/perms.acl

Причина, по которой вы должны быть на один уровень выше, заключается в том, что все пути в perms.acl являются относительными.

Должно быть сделано как root.

Если у вас есть источник и назначение, вы можете синхронизировать свои разрешения с rsync -ar --perms source/ dest

Он не будет передавать данные, только разрешения ...

Вы могли бы использовать найти команда для создания сценария с командами, необходимыми для копирования разрешений. Вот краткий пример, вы могли бы сделать намного больше с различными параметрами printf, включая получение владельца, идентификатора группы и так далее.

$ find /var/log -type d -printf "chmod %m %p \n" > reset_perms
$ cat reset_perms
chmod 755 /var/log
chmod 755 /var/log/apt
chmod 750 /var/log/apache2
chmod 755 /var/log/fsck
chmod 755 /var/log/gdm
chmod 755 /var/log/cups
chmod 2750 /var/log/exim4
...

Это можно сделать с помощью следующей строки оболочки:

D1=foo; D2=foo2; for entry in $(find $D1  -exec stat -f "%N:%Mp%Lp" {} \;); do $(echo $entry | sed 's#'$D1'#'$D2'#' | awk -F: '{printf ("chmod %s %s\n", $2, $1)}') ; done

просто установите правильное значение для переменных D1 и D2, укажите им исходный и целевой каталоги, запустите, и каталоги будут иметь разрешения в синхронизации.

Два пути:

  1. Если это работает с вашим брендом UNIX: cp -ax / src / dest
  2. Если нет, то это портативная версия: (cd / src && tar cpf -.) | (cd / dst && tar xpf -)

(в последнем случае должен существовать / dst)

Изменить: извините, я неправильно прочитал. Не то, что вы просили.

Думаю, я бы написал для этого Perl-скрипт. Что-то вроде:

#!/usr/bin/perl -nw

my $dir = $_;
my $mode = stat($dir)[2];
my $pathfix = "/some/path/to/fix/";
chmod $mode, $pathfix . $dir;

Затем сделайте что-то вроде этого:

cd /some/old/orig/path/ ; find . -type d | perlscript

Я списал это в голове, и это не было проверено; так что проверьте это, прежде чем позволить ему разрастаться. Это только исправляет разрешения для существующих каталогов; он не изменит права доступа к файлам и не создаст отсутствующие каталоги.

Я придумал это:

find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh

Он не является полностью противопульным, но делает то, что мне нужно.