Чи є команда або прапор для клонування користувача / групи прав власності та дозволів на файл з іншого файлу? Щоб зробити perms та права власності саме на інший файл?
Чи є команда або прапор для клонування користувача / групи прав власності та дозволів на файл з іншого файлу? Щоб зробити perms та права власності саме на інший файл?
Відповіді:
У GNU / Linux chown
і chmod
є --reference
опція
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--reference
параметр chmod
і chown
раніше :).
На будь-якому 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
Зробив команду bash на основі відповіді Маттео :)
Код:
chmod $( stat -f '%p' "$1" ) "${@:2}"
Використання:
cp-permissions <from> <to>...
${*:2}
? Ніколи більше не роби так! Це не вдасться, якщо будь-яка з імен файлів містить пробіл (або вкладки). Використовуйте "${@:2}"
. Також використовуйте "$1"
замість просто $1
.
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, для відновлення файлів у відомий стан. Однак ця інформація подається у форматі, який неможливо використовувати безпосередньо цими утилітами або бути легко переводиться у формат, який можна використовувати ".
Якщо ви не використовуєте систему з 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}
ls -l
результатів ви могли б проаналізувати stat
вихід.
stat
синтаксис * BSD . Ваша chmod $(stat ...)
команда не буде працювати, оскільки %p
окремо виводить занадто багато інформації для * BSD chmod
, використовуйте %Lp
для виведення лише u / g / o бітів. Для клейких / встановлених / встановлених бітів потрібно буде дещо більш детальне.
Я хотів додати коригування до сценарію Маттео . Цикл 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
не було знайдено. Це може бути проблемою з моєю конфігурацією.
Це працює для мене:
cp -p --attributes-only <from> <to>