В моем 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