Linux

Linux:同步兩個目錄的權限,使用者和組,保持文件內容不變

  • September 18, 2013

在我的 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切換到chmodchown來執行此操作,例如

#!/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

你可以試試這個。您需要此腳本所需的 2 個參數的絕對路徑。像這樣執行它 copyperms.sh source_dir target_dir

這是腳本:cat 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 循環來適應更多用途,但速度較慢..

$ time perms /adp/code /adp/safe/code

使用 xargs:

真實 0m0.107s 使用者 0m0.008s 系統 0m0.004s

使用 while 循環:

實際 0m0.234s 使用者 0m0.012s 系統 0m0.028s 系統 0m0.028s

引用自:https://serverfault.com/questions/328542