Как написать сценарий для функции массового переименования?

Из стандарта :

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

1
06.01.2017, 11:40
3 ответа

Лично я использую 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, такие как ? или * .

0
27.01.2020, 23:46

команда 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/// подставляем \$Ns в шаблон так, как мы хотим их видеть.

0
27.01.2020, 23:46

Я обнаружил, что vidir является наиболее гибким и прозрачным решением для этих проблем. Там вы просто редактируете текстовый файл с именами файлов любым способом (в VIM или другом редакторе), и изменения применяются.

1
27.01.2020, 23:46

Теги

Похожие вопросы