![](/img/trans.png)
[英]move all the folders and files to the folder with the same subject name in the directory Linux
[英]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] 但它只采用第一个文件夹名称并将其应用于我希望它单独处理每个文件夹名称(命名为权限)的所有内容
您的尝试在几个方面是错误的,其中包括:
[0-9][0-9][0-9]
模式匹配包含非八进制数字字符的名称。
[0-9][0-9][0-9]
模式在解析命令时将被 shell 扩展。 如果扩展成功,则第一个匹配的名称将给出要应用的模式。 如果扩展不成功,那么(默认情况下)模式本身将传递给chmod
,它将拒绝它作为无效模式。
默认情况下, xargs
命令将接受尽可能多的输入,以将 arguments 形成为一个命令。 因此,在您的示例命令中,如果find
标识文件夹700
、 555
、 755
和400
那么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
保存目录名555
和chmod
权限值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.