我想编写一个.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
答案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 的网站
干杯。--
戴夫