Filesystems
遞歸更改文件權限但不更改目錄?
我正在對已遷移到 unix 系統的某些文件的權限進行大規模遞歸更改。我把它們改成ug+rw,但後來發現不能遍歷子目錄。我查看了手冊頁
chmod
並沒有看到任何排除目錄的解釋,所以我搜尋了一下,發現人們習慣於find
遞歸地將目錄的權限更改為使用者和組的“執行”。我這樣做了,然後我可以調查他們。但在我看來,我應該能夠做到這一點
chmod
——遞歸地將文件更改為讀/寫,但不使目錄不可遍歷。我是否以“正確”的方式做到了這一點,還是有更簡單的方法來做到這一點?
更好的解決方案應該是
chmod -R ug=rwX,o=rX /path
其中大寫的
X
意思是:設置執行位 if該文件是一個目錄或已經對某些使用者具有執行權限
(引自
chmod
手冊頁)。或者,如果你想使用
find
find /path \( -type f -exec chmod ug=rw,o=r {} + \) -o \ \( -type d -exec chmod ug=rwx,o=rx {} + \)
使用 find 是“正確”的方式,也是唯一的程式方式,儘管有一些變化:
find . -type f -exec chmod ug+rw {} + # "+" may not be on all systems
要麼
find . -type f -print0 | xargs -r0 chmod ug+rw # similar to the -exec + functionality
或最慢的:
find . -type f -exec chmod ug+rw {} \; # in case xargs is not installed
每個都選擇一個文件(不是目錄,不是符號連結)並
chmod
在其上應用命令。前兩個chmod
通過每次將文件附加到內部命令行的末尾直到達到最大值(通常為 10)來減少呼叫次數,然後呼叫命令並開始重建新命令。最後一條語句為每個文件生成一個新程序,因此效率較低。