我怎样才能 chmod/chown 特定的文件列表?

我怎样才能 chmod/chown 特定的文件列表?

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

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

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

此外,有没有办法改变文件列表,并排除一些其他文件,例如:

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

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

答案1

几乎所有 Unix 工具都接受文件列表作为非选项参数。通常,不同的参数必须用空格分隔:

chmod 644 one two three

在第二个示例中,如果你使用 Bash,则一个简单的

chmod -R 644 !(cache)

就足够了。

此方法需要扩展模式匹配。如果禁用,可以使用以下命令启用它

shopt -s extglob

看:Bash 参考手册 # 模式匹配

答案2

列出文件名./list-of-filenames-to-change.txt然后运行:

chmod g+w `cat list-of-filenames-to-change.txt`

或者使用这里其他人描述的方法:

chmod 644 one two three

或者直接使用第一个选项,但对文件中的每一行进行操作(在这个例子中:用“ ./”替换“ /”(前面有空格)):

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

答案3

如果您要修改的文件位于一个目录中,您可以使用所需的模式对它们进行 ls 。

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

chmod +x `ls *.run`

答案4

正则表达式赢!

除了使用可能已经存在于您的特定 shell 中或您正在使用的应用程序中的正则表达式之外,使用 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-either-string-in-linux-find-command

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

因此,虽然正则表达式并不那么有效,但至少我们有办法在一行代码中将文件列表注入到程序的参数中。

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

我在旅途中可能还会向您提供其他链接和内容:
各种趣闻 - 来自 Korn Bourne 和朋友们的笔记。 - Dave Horner 的网站

干杯。--
戴夫

相关内容