Из стандарта :
В словах , Алгоритм определения общего доступа следует интерпретировать как следует (это описание является вольным перефразированием общего доступа алгоритм определения, который указан в подробном псевдокоде в Менеджеры ACL):
Соответствие (в смысле, определенном в псевдокоде в Менеджерах ACL) входящий PAC против ACL доступа ACL (в показан порядок сверху вниз, а именно: UO, U, FU, GO / G / FG, O, FO, AO), остановка при первом таком совпадении (за исключением того, что все совпадения считается "одновременно" в случае указанных группоподобных ACLE) и обратите внимание на разрешения, предоставленные сопоставленным ACLE (или, в случае групповых ACLE объединение разрешений предоставлено всеми соответствующими ACLE).
Маскировать (то есть пересекать) полученные разрешения против разрешения в маске ACL ACLE, если необходимо (а именно, маска с разрешениями MASK_OBJ, если совпадение произошло в центре столбец 1 и / или маска с НЕСАНКЦИОНИРОВАННЫМИ разрешениями, если PAC не аутентифицирован). (Если диспетчер ACL не поддерживает эти два маскировать ACLE, этот шаг является нулевой операцией.)
(курсив в оригинале, сноска добавлена)
То есть, если есть файл с пользователем и группой root
и разрешениями 0600
, называется acl-test
, содержащий единственную строку , возможно чтение
, тогда:
$ getfacl acl-test
# file acl-test
# owner: root
# group: root
user::rw-
group::---
other::---
Теперь, если я (как пользователь fox
) попытаюсь cat
это:
$ cat acl-test
cat: acl-test: Permission denied
Я нахожусь в группах пользователей
и wheel
, поэтому мы можем добавить определенные ACL для этих групп:
# setfacl -m g:users:--- -m g:wheel:r-- acl-test
$ cat acl-test
read possible
Это потому, что записи группы
(рассматриваемые одновременно) разрешают чтение одной из моих групп. Их можно комбинировать:
# setfacl -m g:users:-w- acl-test
$ getfacl acl-test
# file: acl-test
# owner: root
# group: root
user::rw-
group::---
group:wheel:r--
group:users:-w-
mask::rw-
other::---
$ printf '%s\n' 'write possible' >> acl-test
$ cat acl-test
read possible
write possible
Итак, теперь я могу читать и записывать файл, даже если группы, которые разрешают эти разрешения, не являются одной и той же группой.
Поскольку правила пользователя применяются раньше правил группы, мы все еще можем ограничить данного пользователя от чтения и / или записи содержимого:
# setfacl -m u:fox:--- acl-test
$ getfacl acl-test
# file: acl-test
# owner: root
# group: root
user::rw-
user:fox:---
group::---
group:wheel:r--
group:users:-w-
mask::rw-
other::---
$ cat acl-test
cat: acl-test: Permission denied
Если файл действительно предназначен только для чтения для всех, кроме владельца:
# setfacl -x u:fox -m g::rw- -m m:r-- acl-test
$ getfacl acl-test
# file: acl-test
# owner: root
# group: root
user::rw-
group::rw- #effective:r--
group:wheel:r--
group:users:-w- #effective:---
mask::r--
other::---
$ printf '%s\n' 'now writing is impossible' >> acl-test
bash: acl-test: Permission denied
# printf '%s\n' 'owner can still write' >> acl-test
Забавно, но маска не отменяет разрешения другие , поэтому:
# setfacl -x g:users -x g:wheel -m o:rw- -n acl-test
$ getfacl acl-test
# file: acl-test
# owner: root
# group: root
user::rw-
group::rw- #effective:r--
mask::r--
other::rw-
$ printf '%s\n' 'others can write now' >> acl-test
# chown :users acl-test
$ printf '%s\n' 'but not members of the owning group' >> acl-test
bash: acl-test: Permission denied
1 Центр столбец "относится к этому изображению и содержит все, кроме UO и O, поэтому на владельца-пользователя и других не действует маска. Затрагиваются все группы и пользователи, не являющиеся владельцами с определенными правилами , .
Лично я использую mmv
для такого рода задач. Другие используют переименовать
. Моя попытка (очевидно, не проверенная, поэтому попробуйте сначала с параметром -n
):
for dir in ....; do
( cd "$dir"; mmv -r "HEXA DECA - Season ?? Episode ?? - *" "HE'XA DECA - S#1#2E#3#4 - #5" )
done
I cd
сначала в $ dir
вместо выполнения ] mmv "$ dir / ..."
, что тоже возможно. Это сделано для того, чтобы избежать ситуаций, когда ваш каталог может содержать специальные символы mmv, такие как ?
или *
.
команда rename
делает то, что вам нужно:
find . -type f -exec rename "s/^(.*\/)HEXA DECA - Season ([0-9]*) Episode ([0-9]*) (.*)\$/\$1HE'XA DECA - S\$2E\$3 \$4/" {} \;
Нам нужны обратные слеши, потому что в одинарных кавычках '
не экранируется, а в двойных кавычках мы должны экранировать символ $
.
Здесь мы находим все файлы в каталоге и подкаталогах и пытаемся их переименовать.
s/regexp/smth
заменит все совпадения regexp
на smth
.
^(.*\/)
- первая часть пути, все без базового имени, сохраняется в \$1
.
HEXA DECA - Season
и Episode
- части, которые не будут сохранены, но они являются шаблонами для сопоставления.
([0-9]*)
s - номер сезона и эпизода, сохраняются в \$2
и \$3
.
(.*)$
- последняя часть строки, содержит название эпизода, \$4
.
Во второй части s///
подставляем \$N
s в шаблон так, как мы хотим их видеть.
Я обнаружил, что vidir
является наиболее гибким и прозрачным решением для этих проблем. Там вы просто редактируете текстовый файл с именами файлов любым способом (в VIM или другом редакторе), и изменения применяются.