用於遞歸檢查目錄的權限和擁有者並編寫 shell 腳本來重新建立它們的腳本

用於遞歸檢查目錄的權限和擁有者並編寫 shell 腳本來重新建立它們的腳本

我正在嘗試編寫一個 shell 腳本來保留和重寫具有多個子目錄的大目錄中的所有權限/群組,以防它們被更改或未正確創建,或者在不同的電腦上鏡像此目錄的使用者/權限。

就像是:

chown adam:brown /var/blarg
chmod 770 /var/blarg
chown adam:brown /var/blarg/toast.file
chmod 777 /var/blarg/toast.file

...etc

手動完成此操作將需要很長時間。我想知道是否有現有的命令/腳本來完成此任務?

答案1

沿著@yeti的評論,我不久前思考過這個問題,似乎記得得出這樣的結論:

find /path/to/dir -printf '%m\t%u\t%g\t%p\0' > filelist

進而

while read -rd $'\0' perms user group file; do 
  if [ -e "$file" ]; then
    chown "$user:$group" "$file"
    chmod "$perms" "$file"
  else
    echo "warning: $file not found"
  fi
done < filelist

會工作。將檔案名稱放在輸出的最後,並使用read和 null 終止符而不是換行符應該即使檔案名稱帶有空格和其他特殊字符,也能確保安全。根據您要執行第二個指令的位置,使用刪除了指令/path/to/dir中前導元件的檔名(即代替.find%P%p

答案2

正如 Yeti 在評論中建議的那樣,我使用 find 命令來尋找目錄中的所有檔案和目錄,並將其權限/所有者輸出到 chown 或 chmod 命令中。我添加了詳細-v選項,以便在運行生成的 shell 腳本時,您可以看到命令的成功/錯誤:

find /var/blarg -printf 'chown -v %u:%g %p\n' > chowns.sh
find /var/blarg -printf 'chmod -v %m %p\n' > chmods.sh

現在只需使生成的 .sh 檔案可執行即可:

chmod +x chowns.sh; chmod +x chmods.sh

然後運行它們並將詳細反饋輸出到 txt 檔案:

./chmods > chmods_results.txt

繁榮。

答案3

你提到events,如果你有真的許多文件,監視這些文件是有意義的。您可能想看看inotifywatch,它“監聽檔案系統事件”,例如檔案權限的變更。在基於 debian 的作業系統上,它位於 package 中inotify-tools

相關內容