繁体   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