Бит setgid вам не поможет -он влияет только на право собственности, а не на то, что владелец может делать с файлом.
Что может сработать, если общая область хранения смонтирована в другой файловой системе. Вам нужно будет попросить администратора смонтировать его с явно установленным правильным umask, чтобы вы могли обмениваться файлами. Или файлы монтируются с помощью внутренней -только общей папки samba -, что является излишним, но samba легко допускает определенную группу и модель разрешений по сравнению с тем, что предоставляет ОС.
Одним словом, -некоторые из нас думают, что буква «С» в слове «ИТС» означает обслуживание. Если у них есть требование umask 077, им нужно придумать эффективный способ обмена файлами для вас.
(и бит setgid не работает)
ivan@darkstar:~$ umask
0002
ivan@darkstar:~$
ivan@darkstar:~$ umask 077
ivan@darkstar:~$ umask
0077
ivan@darkstar:~$ mkdir te
ivan@darkstar:~$ ls -ld te
drwx------ 2 ivan ivan 4096 Sep 7 18:53 te
ivan@darkstar:~$ umask 2
ivan@darkstar:~$ umask
0002
ivan@darkstar:~$ groups
ivan adm cdrom sudo dip plugdev lpadmin sambashare kvm webdev
ivan@darkstar:~$ sudo chown.webdev te
ivan@darkstar:~$ sudo chmod g+w te
ivan@darkstar:~$ ls -ld te
drwx-w---- 2 ivan webdev 4096 Sep 7 18:53 te
ivan@darkstar:~$ chmod g+rx te
ivan@darkstar:~$ sudo chmod g+s te
ivan@darkstar:~$ ls -ld te
drwxrws--- 2 ivan webdev 4096 Sep 7 18:53 te
ivan@darkstar:~$ cd te
ivan@darkstar:~/te$ umask 077
ivan@darkstar:~/te$ umask
0077
ivan@darkstar:~/te$ touch test
ivan@darkstar:~/te$ ls -l
total 0
-rw------- 1 ivan ivan 0 Sep 7 18:54 test
ivan@darkstar:~/te$
С помощью обхода вы можете проверить, совпадают ли строки вокруг |
или нет. Например:
$ cat ip.txt
[[foo>a|d]]
[[foo>b|e]]
[[foo>c|f]]
# same as: rg -NP '\[\[([^>]+)>([^|]+)\|(?!\2])([^|]+)]]' -r ':$1:`$3 <$2>`'
$ perl -pe 's/\[\[([^>]+)>([^|]+)\|(?!\2])([^|]+)]]/:$1:`$3 <$2>`/' ip.txt
:foo:`d <a>`
:foo:`e <b>`
:foo:`f <c>`
(?!\2])
— это утверждение с отрицательным просмотром вперед, гарантирующее, что строки вокруг |
различны.
Чтобы реализовать и то, и другое, вы можете использовать код Perl в секции замены с флагом e
.
$ cat ip.txt
[[foo>a|a]]
[[foo>b|b]]
[[foo>c|c]]
[[foo>a|d]]
[[foo>b|e]]
[[foo>c|f]]
$ perl -pe 's/\[\[([^>]+)>([^|]+)\|([^|]+)]]/":$1:`$3". ($2 eq $3 ? "`" : " <$2>`")/e' ip.txt
:foo:`a`
:foo:`b`
:foo:`c`
:foo:`d <a>`
:foo:`e <b>`
:foo:`f <c>`
Здесь ($2 eq $3 ? "`" : " <$2>`")
выберет строку в зависимости от того, совпадают ли строки вокруг |
или нет.
Кажется, что мы могли бы разделить эту задачу на 2 -3 отдельные части. Сначала мы сжимаем(-s
)и заменяем некоторые символы на tr
, чтобы создать «контур» вывода, а затем с помощью sed
мы делаем две отдельные замены, одну для двух совпадающих символов и одну, когда они совпадают. разные.
< file tr -s '[<>|]' ':::``' | sed -E 's/(.)`\1`/`\1`/; s/([^:])`(.)`/`\2 <\1>`/'
Тестирование:
$ cat file
[[foo>a|a]]
[[foo>b|b]]
[[foo>c|c]]
[[foo>a|d]]
[[foo>b|e]]
[[foo>c|f]]
$ <file tr -s '[<>|]' ':::``' | sed -E 's/(.)`\1`/`\1`/;s/([^:])`(.)`/`\2 <\1>`/'
:foo:`a`
:foo:`b`
:foo:`c`
:foo:`d <a>`
:foo:`e <b>`
:foo:`f <c>`