2

我正在尝试更改 ~/Documents 文件夹中文件的所有权限,我认为下面的小循环会起作用,但它似乎不起作用。谁能帮我?这是循环:

files=~/Documents/*
for $file in $files {
   chmod 755 $file }

我正在尝试将其直接写入 bash 命令行,但出现以下错误:

-bash: syntax error near unexpected token `chmod'

感谢您的帮助/建议

4

4 回答 4

5

使您的文档可执行是有风险的。除非您确切知道自己在做什么,否则我建议不要这样做。

我会大胆猜测您并不想让您的所有 Documents 文件夹都可执行,而您真正想要做的是标准化该文件夹中所有内容的用户可写其他所有人可读权限.

Note that (as someone mentioned in another answer) the chmod command has its own "recursive" option, -R. Note also that you can use "symbolic" permissions with chmod, you're not stuck with octal-only. So:

chmod -R go+r-wx ~/Documents/

will add Read and remove Write and eXecute functions from everything in and under ~/Documents/.

Note that this will make subdirectories readable, but will not provide access to the files within them (because that's what the executable bit on a directory does). So you may want to use TWO commands:

find ~/Documents/ -type d -exec chmod 755 {} \;
find ~/Documents/ -type f -exec chmod 644 {} \;

The first line only runs chmod on directories, making them both readable and accessible. The second line affects only your files, making them readable by the world.

于 2012-07-14T19:26:32.677 回答
3

尝试

find . -exec chmod 755 {} +\;

或者

find . -type f -exec chmod 755 {} +\;
于 2012-07-14T18:27:21.997 回答
2

循环应该是:

for file in $files
do
   test -f "$file" && chmod 755 "$file"
done  

请注意,当您说哪个也将包含目录时,您依赖的是globbing,因此使用循环也会更改目录的权限。您可以添加一个简单的测试,以确保您只更新文件的权限。另请注意,可以关闭通配符,在这种情况下,其值可能不是文件名;这也不符合您的目的。 files=~/Documents/*~/Documentsset -ffiles<HOME_DIR>/*

更重要的是,正如ghoti评论中指出的那样,依赖globbing并不是一个好主意。当您使用带连字符的文件名通配符时,可能会出现未定义的行为,而带分号的文件名可能会导致安全漏洞。除了与 globbing 相关的安全漏洞之外,还有一些与之相关的 常见 陷阱。请查看ghoti 提供的答案,其中突出了您当前操作所涉及的一些风险。

您也可以使用find(这将对所有文件进行递归设置):仅针对您可以使用以下选项
find ~/Documents/ -type f -exec chmod 755 {} \;
的文件设置权限:~/Documents/-maxdepth
find ~/Documents/ -maxdepth 1 -type f -exec chmod 755 {} \;

希望这可以帮助!

于 2012-07-14T18:26:06.643 回答
1

为什么不:

chmod -R 755 ~/Documents
于 2012-07-14T18:41:37.517 回答