我如何chmod / chown一个特定的文件列表?


31

我想编写一个.sh脚本来设置一些文件夹权限,但是想知道我是否可以运行以下命令:

chown -644 ./one;/two;/three

整理文件夹列表,而不是多次调用chown。

另外,是否有一种方法可以整理文件列表,并排除其他文件,例如:

chown -R -664 ./*;!./cache

我希望我的伪命令行有意义。

Answers:


43

几乎所有的Unix工具都将文件列表作为非选项参数。和往常一样,不同的参数必须用空格隔开:

chown 644 one two three

在第二个示例中,如果您使用的是Bash,

chown -R 644 !(cache)

就足够了。

这种方法需要扩展的模式匹配。如果已禁用,则可以使用

shopt -s extglob

请参阅:Bash参考手册#模式匹配


4

在mod-these.txt中列出文件名,然后运行:

chmod g+w `cat mod-these.txt`

或使用此处其他人描述的方法:

chown 644 one two three

或使用第一个选项前往城镇,但操纵文件中的每一行(在此示例中:将“ /”(之前带空格)替换为“ ./”):

chmod g+w `sed 's/ \// .\//' update-writable.txt` 

2

正则表达式为赢!

使用find是我能想到的最好的方法,除了使用正则表达式之外,该正则表达式可能已经存在于您的特定外壳中或您正在使用的应用程序中。首先,我尝试:

touch one&touch two &touch three&find -name "one|two|three" -exec chown -644 {} \;

但是,您会发现管道在这种情况下不起作用。要学习的另一个可悲的事情是……学习chmod,chown,chgrp等。等
我自己不支持多文件/正则表达式选择/排除... 我找到的解决方案:https : //stackoverflow.com/questions/19111067/regex-match-要么-string-in-linux-find-command

find \( -name one -o -name two -o -name three \) -exec chown -644 {} \;

因此,获胜的正则表达式不是很多,但是至少我们有一种方法可以在一个衬套中将文件列表注入程序的args中。

您会注意到,您需要转义()元字符,并为每个其他名称添加-o参数...

来自我的其他链接和内容,可能会对您的旅行感兴趣:
各种花絮-康恩·本恩和朋友的笔记。-戴夫·霍纳(Dave Horner)的网站

干杯。
-戴夫


吻赢,保持简单和愚蠢!无需复杂的事情,这些事情仍然可以轻松进行。
Al-Mothafar '16

2

如果要修改的文件位于一个目录中,则可以使用所需的模式将它们命名。

例如,我需要将pwd中所有下载的.run文件更改为可执行文件:

chmod +x `ls *.run`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.