Permissions

更改目前目錄及其所有子目錄中某些文件的權限時,如何處理帶空格的文件名?

  • May 24, 2021

我目前正在嘗試將.html目前目錄及其所有子目錄中具有副檔名的所有文件設置為它們的所有者可讀、可寫和可執行,並且只能由組和其他人讀取(不可寫或可執行)。但是,有些文件的名稱中有空格,我不確定如何處理。

我的第一次嘗試:

chmod -Rv u+rwx,go+r '* *.html'

當我第一次嘗試時,我收到以下消息:

chmod: cannot access '* *.html': No such file or directory
failed to change mode of '* *.html' from 0000 (---------) to 0000 (---------)

我的第二次嘗試:

find . -type f -name "* *.html" | chmod -Rv u+rwx,go+r

我添加了一個管道運算符,以便將find命令的輸出發送到chmod. 但是,當我嘗試第二次嘗試時,我得到以下資訊:

chmod: missing operand after ‘u+rwx,go+r’

經過我的嘗試,我仍然對如何處理文件名中的空格以遞歸地更改設置權限感到困惑。處理這個問題的最佳方法是什麼?任何回饋或建議表示讚賞。

使用-exec謂詞find

find . -name '* *.html' -type f -exec chmod -v u+rw,go+r {} +

(這裡,rw-r--r--僅添加權限是因為將執行權限添加到 html 文件幾乎沒有意義,因為這些文件通常不會被執行。替換+=以準確設置這些權限,而不是這些位添加到目前權限)。

您還可以在! -perm -u=rw,go=r之前添加一個-exec以跳過已經(至少)具有這些權限的文件。

通過(這也是 shell 的內置函式)的sfind實現find,您可以使用謂詞後跟(應用更改):findbosh-chmod``-chfile

sfind . -name '* *.html' -type f -chmod u+rw,go+r -chfile

(在那裡,不需要添加! -perm...as已經跳過了已經具有正確權限的文件)sfind-chfile

那個是最有效的,因為它不涉及chmod 在新程序中為每這麼多文件執行單獨的命令,還因為它避免了兩次查找每個文件的完整路徑(使用文件的路徑sfind呼叫chmod()系統呼叫相對於目錄sfind 在爬行期間找到它們,這意味著chmod()不需要再次查找通向它們的所有路徑組件)。

zsh

chmod -v -- u+rw,go+r **/*' '*.html(D.)

這裡使用 shell 的遞歸萬用字元和D. glob 限定符分別包含隱藏文件並限制為正常文件(就像這樣-type f做)。添加^f[u+rw,go+r]到還跳過已經具有這些權限的文件。

您不能將chmod’s-R與 glob 結合使用。Glob 由 shell 擴展,而不是 匹配chmod,因此使用chmod -Rv ... *' '*.html(請注意,這些*必須不加引號,以便 shell 將它們解釋為萬用字元),您只需將html文件列表傳遞給chmod並且僅當這些文件中的任何一個是目錄將 chmod 遞歸到其中並更改其中所有文件的權限。

引用自:https://unix.stackexchange.com/questions/651086