Права клонирования и разрешения от другого файла?

Есть ли команда или флаг для клонирования прав пользователя / группы и разрешений на файл из другого файла? Сделать perms и владение точно «похожим» на другой файл?

  • Список файлов, к которым обращается программа
  • Одновременная запись в файл журнала из многих процессов
  • Как установить строку как столбец в unix
  • Как создать резервную копию читаемых, но не записываемых файлов с помощью rsync?
  • Количество файлов, содержащих заданную строку
  • Цветной выход grep: не GREP_OPTIONS не является псевдонимом
  • Загрузка файлов по ssh на основе списка имен файлов
  • ls занимает много времени в небольшом каталоге
  • Сортировка файлов по наивысшему числу в имени файла
  • Как предоставить разрешения для чтения, но не удалить файл
  • Это UUOC (бесполезное использование кошки) для перенаправления одного файла на другой?
  • Как добавить «открыть папку в качестве пользователя» в контекстном меню «Элементарный файловый менеджер ОС»?
  • 5 Solutions collect form web for “Права клонирования и разрешения от другого файла?”

    На GNU / Linux chown и chmod есть опция --reference

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

    В любом unix с утилитами GNU, таких как (не встроенные) Linux или Cygwin, вы можете использовать chmod --reference и chown --reference .

    Если ваша система имеет ACL , попробуйте команды ACL getfacl и setfacl . Эти команды немного отличаются от системы к системе, но на многих вы можете использовать getfacl other_file | setfacl -bnM - file_to_change 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 на основе ответа Matteo 🙂

    Код:

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

    Применение:

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

    Если вы не используете систему с 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} 

    Я хотел добавить корректировку к скрипту Маттео . Цикл 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 не был найден. Однако это может быть проблемой с моей конфигурацией.

    Linux и Unix - лучшая ОС в мире.