Назад | Перейти на главную страницу

Linux: синхронизировать права доступа к двум каталогам, пользователям и группам и оставить содержимое файла нетронутым

В моем Linux-боксе у меня есть два каталога:

Мне нужно синхронизировать только разрешения без изменения содержимого файла. Я пробовал rsync, но не могу найти подходящего варианта. Вы можете дать мне совет?

Заранее спасибо.

РЕДАКТИРОВАТЬ

Благодаря вашим предложениям у меня есть этот сценарий. Он рекурсивно изменяет разрешения поддерева:

#!/bin/bash
cd good
find $1/* | while read DIR
do
 chown --reference="$DIR" "/bad/$DIR"
 chmod --reference="$DIR" "/bad/$DIR"
done

Не шедевр, но у меня работает.

Вы можете использовать --reference=file переключиться на оба chmod и Chown сделать это например

#!/bin/bash
for FILE  in /path/to/good/directory/*
do
    chown --reference="$FILE" /path/to/bad/directory/"$(basename "$FILE")"
    chmod --reference="$FILE" /path/to/bad/directory/"$(basename "$FILE")"
done

Вы можете попробовать это. Вам нужны абсолютные пути для двух аргументов, необходимых для этого сценария. Запустите его так: copyperms.sh source_dir target_dir

Вот сценарий: кот copyperms.sh

#!/bin/bash

srcDir="$1"
targDir="$2"

if [ -z "$srcDir" ] || [ -z "$targDir" ]; then
    echo "Required argument missing."
elif [ ! -d "$srcDir" ] || [ ! -d "$targDir" ] ; then
    echo "Source and target not both directories."
    exit
else
    cd $srcDir

    echo "Source directory: $srcDir; Target directory: $targDir"
    echo "Matching permissions and ownerships .."
    find . -print0 | xargs -0I {} echo {} | xargs -I {} chmod --reference "{}" "$targDir/{}"
    find . -print0 | xargs -0I {} echo {} | xargs -I {} chown --reference "{}" "$targDir/{}"
    # find . | while read name
    # do
    #   chmod --reference "$name" "$targDir/$name"
    #   chown --reference "$name" "$targDir/$name"
    # done
    echo ".. done!"
fi

Может адаптироваться для большего количества применений, используя закомментированный цикл while, но он медленнее.

$ время mperms / adp / code / adp / safe / code

Использование xargs:

реальный 0m0.107s пользователь 0m0.008s sys 0m0.004s

Использование цикла while:

реальный 0m0.234s пользователь 0m0.012s sys 0m0.028s sys 0m0.028s