Вопрос: Скопировать разрешения на идентичное дерево в linux / unix


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

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


21
2017-08-25 06:59


Источник




Ответы:


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

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, укажите их в исходные и целевые каталоги, запустите, а в каталогах будут иметь разрешения в синхронизации.


8
2017-08-25 08:10



Найти, sed и awk в одной строке. Мне это нравится (я тоже это делаю). - Thomas
бит длинный, но совершенный! note: foo должен быть $ D1 - yawniek
Это предполагает, что stat присутствует. Я, к сожалению, обнаружил, что командный стат часто отсутствует. - Mei
@nemtester уверен, исправлено спасибо :) - drAlberT
@ Давид, я не знаю о такой системе, в которой нет статистики. Но достаточно тривиально использовать следующую версию «восьмеричного ls» и соответственно разместить данное решение: alias ols = «ls -la | awk» {k = 0; for (i = 0; i <= 8; i ++) k + = ((substr (\ $ 1, i + 2,1) ~ / [rwx] /) * 2 ^ (8-i)), если (k) printf (\ "% 0o \", k); print} " - drAlberT


Я просто научился новому и простому пути к этому:

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

Это приведет к созданию списка со всеми разрешениями и собственностью.

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

setfacl --restore=/root/perms.acl

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

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


26
2018-02-26 13:05



это очень простой и простой способ резервного копирования и восстановления разрешений. Обратите внимание, однако, что getfacl а также setfacl не обязательно присутствуют во всех системах. - the-wabbit
Правильно ли иметь .ac в первой команде и .acl В секунду? - sfarbota
@sfarbota: Нет, это была опечатка! Исправлено сейчас. Спасибо, что указали это. - marlar


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

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


13
2017-08-25 07:28



Нет, он будет копировать файлы, если временные метки отличаются - yawniek
@yawniek -r а также --permsявляются избыточными, но это все еще синхронизирует perms, если они - единственное, что отличается (это то, что вы сказали в Вопросе, если деревья фактически не идентичны, вы не должны были сказать, что они были). - Chris S
хорошо, тогда я был неясен, я имел в виду, что древовидная структура такая же. - yawniek


Одна вещь, которую вы можете сделать, это использовать найти чтобы создать скрипт с командами, необходимыми для копирования разрешений. Вот краткий пример, вы можете сделать гораздо больше с различными параметрами 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
...

12
2017-08-25 07:34



Я подозреваю, что аргумент -printf для поиска является расширением GNU? У HP-UX find нет этого. - Mei
Даже без опции printf можно использовать опцию ls (или, в худшем случае, pipe to xargs ls -l) и сохранять в файле. Через минуту или два поиска и замены, и у каждого будет скрипт с chmod для каждого файла. - mpez0


Два пути:

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

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

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


0
2017-08-25 08:28



Стоит отметить, что -a (для архива) является дополнением GNU к cp, я никогда не видел его в какой-либо другой системе. Это просто сокращение для -dpR (без де-ссылки, рекурсивных, сохранения разрешений). Параметры R и p должны быть в любой версии cp - theotherreceive


Я думаю, что я бы написал скрипт 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

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


0
2017-08-25 09:14





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

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

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


0
2017-07-23 23:46