我正在嘗試編寫一個 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
。