簡體   English   中英

如何根據文件夾名稱更改所有文件夾和文件權限?

[英]How to change all folders and files permessions base on folder name?

例如,我們有以權限編號 555 或 700 或 777 命名的文件夾......我們如何獲取文件名並根據文件夾名稱更改所有具有權限的子文件夾和文件? 所以如果我們將它應用到文件夾 555 上,當前文件夾和里面的所有內容都將獲得 555 的權限,我試過了

find . -name "[0-9][0-9][0-9]" -type d | xargs chmod -Rv [0-9][0-9][0-9]

但它只需要第一個文件夾名稱並將其應用於我希望它單獨處理每個文件夾名稱(命名為withe許可)的所有內容謝謝。

我試過找到。 -名稱“[0-9][0-9][0-9]”-類型 d | xargs chmod -Rv [0-9][0-9][0-9] 但它只采用第一個文件夾名稱並將其應用於我希望它單獨處理每個文件夾名稱(命名為權限)的所有內容

您的嘗試在幾個方面是錯誤的,其中包括:

  1. [0-9][0-9][0-9]模式匹配包含非八進制數字字符的名稱。

  2. [0-9][0-9][0-9]模式在解析命令時將被 shell 擴展。 如果擴展成功,則第一個匹配的名稱將給出要應用的模式。 如果擴展不成功,那么(默認情況下)模式本身將傳遞給chmod ,它將拒絕它作為無效模式。

  3. 默認情況下, xargs命令將接受盡可能多的輸入,以將 arguments 形成為一個命令。 因此,在您的示例命令中,如果find標識文件夾700555755400那么xargs將最終執行如下操作:

     chmod -Rv <... expansion of [0-9][0-9][0-9]...> 700 555 755 400

    即使模式擴展為空(這可能在稍微不同的情況下發生),您也會得到與以前類似的結果:第一個目錄名將提供模式,所有其他目錄名將更新為該模式。

這種變化應該做你想做的:

find . -name "[0-7][0-7][0-7]" -type d |
  sed 's,^.*/\([^/]*\)$,\1\n\0,' |
  xargs -r -l2 chmod -Rv

sed命令獲取find發出的每個路徑,提取基本名稱,並將其放在單獨的前一行中。 例如,如果其中一行find發出的是

./subdir/755

然后 sed 將其更改為

755
./subdir/755

. 即,要應用的模式和應用它的目錄。

然后xargs-l2選項告訴它在形成每個chmod命令時使用(最多)兩個輸入行,所以你最終會得到一系列形式的命令

chmod -Rv 755 ./subdir/755

xargs-r選項很巧妙,告訴它如果沒有從標准輸入中讀取任何行,則完全避免執行任何命令。

附錄:更詳細的sed表達式

[注意:我稍微簡化了此答案原始版本中給出的sed命令。]

sed命令...

  sed 's,^.*/\([^/]*\)$,\1\n\0,'

... 根據給定的表達式處理每個輸入行,這是一個帶有逗號 ( , ) 分隔符s替換命令。

  • 目標模式是^\(.*/\)\([^/]*\)$ 這匹配
    • 從行首開始的序列 ( ^ ),
    • 匹配任意數量的任意字符.* ,
    • 后跟一個斜杠 ( / ) 字符,
    • 后跟除斜杠 ( [^/]* ) 以外的任意數量的任何字符
    • 運行到行尾 ( $ )。
  • 最后一個斜線之后的部分被捕獲為一個組。
  • 替換文本是
    • 第一個(僅)捕獲組( \1 )的內容,然后是
    • 換行符 ( \n ),然后是
    • 整個匹配 ( \0 ),這將是原始行,因為匹配被錨定到行的開頭和結尾。

sed會將每個輸入行與目標模式進行匹配。 任何包含至少一個斜杠的行都將匹配,並且給定find命令發出的每一行都將滿足該條件。 整個匹配項(將是整行)將由給定的替換項替換,由兩行組成——一行包含最后一個斜杠后面的原始行的尾部,另一行包含整個原始行。

不確定是否理解問題。

需要示例輸入和示例output才能理解。

建議以下解決方案:

 dir_name="555"; chmod -R "$dir_name" $(find . -path "*$dir_name*")

解釋

dir_name="555"; : 分配一個變量dir_name保存目錄名555chmod權限值555

$(find. -path "*$dir_name*") :列出當前目錄下的所有文件,其路徑中某處有555個文件。

chmod -R "$dir_name" : Chmod 命令使用dir_name 555的值

我會用這樣的東西。

find . -type d -name '???' -printf '%f\n' | xargs -I'{}' chmod -R  '{}' '{}'
  • -type d -- 只查找目錄。
  • -name??? -- 這將覆蓋名為 555、700、777 等的目錄
  • printf '%f\n' -- 只打印目錄名。

為了真正安全,我會添加另一個選項( -maxdepth ):

find . -maxdepth 1 -type d -name '???' -printf '%f\n' | xargs -I'{}' chmod -R  '{}' '{}'
  • maxdepth 1 -- 不要對子文件夾進行任何搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM