Клонувати право власності та дозволи з іншого файлу?


125

Чи є команда або прапор для клонування користувача / групи прав власності та дозволів на файл з іншого файлу? Щоб зробити perms та права власності саме на інший файл?

Відповіді:


175

У GNU / Linux chownі chmodє --referenceопція

chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile

1
Чи можете ви вказати цю відповідь (і, ймовірно, цитувати її) як відповідь на моє запитання: unix.stackexchange.com/questions/44253/… ? , Я думаю, що я стану чудовим доповненням, і я хотів би знайти там голоси.
Grzegorz Wierzowiecki

@GrzegorzWierzowiecki: напевно, це питання має бути закритим, але трохи іншим, ніж це, і вже є відповіді, тому мені краще нічого не робити.
enzotib

За бажанням та пропозицією. Дякую за допомогу, я ніколи не звертав уваги на --referenceпараметр chmodі chownраніше :).
Grzegorz Wierzowiecki

12

На будь-якому unix з утилітами GNU, наприклад (невбудований) Linux або Cygwin, ви можете використовувати chmod --referenceтаchown --reference .

Якщо у вашій системі є ACL , спробуйте команди ACL getfaclта setfacl. Ці команди мало відрізняються від системи до системи, але для багатьох ви можете getfacl other_file | setfacl -bnM - file_to_changeскопіювати дозволи. Це не копіює право власності; ви можете зробити це при ретельному розборі ls -l other_file, припускаючи, що у вас немає імен користувачів або груп, що містять пробіли.

LC_ALL=C ls -l other_file | {
  read -r permissions links user group stuff;
  chown -- "$user:$group" file_to_change
}
getfacl other_file | setfacl -bnM - file_to_change

1
У вас повинен бути встановлений ACL та встановлена ​​файлова система з включеним ACL.
enzotib

2
@enzotib Принаймні в Linux інструменти ACL працюватимуть над копіюванням дозволів (але не володіння ними), навіть якщо вихідна та цільова файлова система не підтримують ACL.
Жиль

7

Зробив команду bash на основі відповіді Маттео :)

Код:

chmod $( stat -f '%p' "$1" ) "${@:2}"

Використання:

cp-permissions <from> <to>...


5
Егад! Де ти навчився говорити ${*:2}? Ніколи більше не роби так! Це не вдасться, якщо будь-яка з імен файлів містить пробіл (або вкладки). Використовуйте "${@:2}". Також використовуйте "$1"замість просто $1.
G-Man

chmod "$(stat -c '%a' "$fromfile")" tofileв GNU Coreutils, але ви можете також використовувати --referenceв цьому випадку, оскільки statутиліта CLI не є POSIX, вона навіть каже pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.htmlt ls -l , що не буде її скорочувати: "Вихід лс (із параметрами -l та пов'язаними з ними) містить інформацію, яка логічно могла б використовуватися утилітами, такими як chmod та touch, для відновлення файлів у відомий стан. Однак ця інформація подається у форматі, який неможливо використовувати безпосередньо цими утилітами або бути легко переводиться у формат, який можна використовувати ".
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

5

Якщо ви не використовуєте систему з chmod / chown GNU (які підтримують цю --referenceопцію), ви можете спробувати проаналізувати вихідls -l

Ось невеликий сценарій для chmod(якщо у вас є бачення, яке підтримує розширені регекси, вони могли бути написані набагато більш читабельним чином ...)

#!/bin/sh

reference=$1
shift
files=$*

# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/"       | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/"    | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}

ОНОВЛЕННЯ :

Це ще простіше за допомогою stat:

chmod $( stat -f '%p' ${reference} ) ${files}

2
Замість розбору ls -lрезультатів ви могли б проаналізувати statвихід.
jfg956

@jfgagne: спасибі має сенс, я не знаю, чому я не думав про це в першу чергу. Я оновив відповідь
Маттео

1
Тут ви використовуєте statсинтаксис * BSD . Ваша chmod $(stat ...)команда не буде працювати, оскільки %pокремо виводить занадто багато інформації для * BSD chmod, використовуйте %Lpдля виведення лише u / g / o бітів. Для клейких / встановлених / встановлених бітів потрібно буде дещо більш детальне.
mr.spuratic

0

Я хотів додати коригування до сценарію Маттео . Цикл for for повинен використовуватися для перевірки того, що файли існують перед тим, як на них дійсно виконати команду chmod. Це дозволить скрипту помилитися вишуканіше.

Я думаю, що це найкращий варіант, оскільки його можна використовувати для всіх * nix ОС, таких як Solaris, Linux тощо.

#!/bin/sh

reference=$1
shift
files=$*

for file in $reference $files; do
  [ -f $file ] || { echo "$file does not exist"; exit 1; }
done

# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}

Я виявив, що на одній із моїх машин Solaris 10 statне було знайдено. Це може бути проблемою з моєю конфігурацією.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.